带有Perl变量的MySQL Query

时间:2012-01-04 16:35:06

标签: perl

我的Perl相当生锈所以请原谅。尝试使用变量编写查询。尝试过重新格式化,似乎无法正确使用它。这是我的代码,不知道我做错了什么。

my $d_var = "$3\n";
my $query="SELECT id FROM `accounts` WHERE (`accounts`.`named` = ?) LIMIT 1";
my $st_h = $db_h->prepare($query);
$st_h->bind_param(1, '$d_var');
  $st_h->execute;
    my $row = $st_h->fetchrow_array();

5 个答案:

答案 0 :(得分:1)

请仔细检查:

  1. $ 3包含合理的内容
  2. 连接3美元的值和“\ n”(通过插值)是正确的(“\ n”在字段中?)
  3. as'not interpolate => my $st_ht->bind_param(1, $d_var);
  4. (我不理解Chris Ledet的DBI Docs。)

    第二个想法:

    此代码段:

      my $v = "nix nix 1001";
      print "$v\n";
      print '$v\n', "\n";
      if ($v =~ m/(nix) (nix) (\d+)/) {
        print 'found: ', $3, "\n";
        $sth = $dbh->prepare('SELECT * FROM sample01.csv WHERE GRUPPE=?');
        $sth->bind_param(1, $3);
        $sth->execute;
        while(my @row = $sth->fetchrow_array()) {
          print '|', join( '|', @row ), "|\n";
        }
      } else {
        print "no match\n";
      }
    

    和输出:

    DBI: 1.616 DBD::CSV: 0.33
    |00000089-6d83-486d-9ddf-30bbbf722583|2011-09-17 16:25:09|1001|
    |000004c9-92c6-4764-b320-b1403276321e|2011-11-09 13:52:30|2000|
    
    
    nix nix 1001
    $v\n
    found: 1001
    |00000089-6d83-486d-9ddf-30bbbf722583|2011-09-17 16:25:09|1001|
    

    应说明:

    1. '没有插值,你的'$ d_var'会将这个变量名字直接传递给DBI
    2. 有效匹配不需要“\ n”到“工作”
    3. bind_param的参数序列是数字,值

答案 1 :(得分:1)

不确定为什么你甚至使用bind_param。在我看来,将额外的值传递给execute就简单得多了。

my $d_var = "$3\n";
my $query = 'SELECT id FROM accounts` WHERE (`accounts`.`named` = ?) LIMIT 1';
my $st_h = $db_h->prepare($query);
$st_h->execute($d_var);
my $row = $st_h->fetchrow_array();

您是否考虑过切换到DBIx::Class

答案 2 :(得分:0)

这是什么意思?

my $st_ht->bind_param(1, '$d_var');

没有引入变量,为什么my

答案 3 :(得分:0)

我在执行前打印了3美元,并且字符串中包含数据。

我有d_var =" $ 3 \ n"因为变量$ 3是由Regex字符串生成的,并且在没有\ n的情况下似乎无法工作。

尝试过克里斯建议的内容,但无效。

答案 4 :(得分:0)

除了丹所说的(删除单引号)之外,你将你的param绑定到一个可能没有的Statement句柄对象$st_ht->bind_param(...)它应该是$st_h->bind_param(...)