Perl SQLite DBI SELECT,绑定不起作用

时间:2014-02-02 22:37:06

标签: perl sqlite select bind dbi

为什么此示例代码中的第二个SELECT语句返回空结果?

use DBI;
use Data::Dumper;

my $dbh = DBI->connect('dbi:SQLite:dbname=test.db', '', '', { AutoCommit =>1, PrintError => 1, RaiseError => 1 }) or die $DBI::errstr;

my $r = $dbh->selectall_arrayref('select 123 where 5 > 2', { Slice => {} }) or die $dbh->errstr;

print Dumper $r;

$r = $dbh->selectall_arrayref('select 123 where 5 > ?', { Slice => {} }, 2) or die $dbh->errstr;

print Dumper $r;

输出

$VAR1 = [
          {
            '123' => 123
          }
        ];
$VAR1 = [];

2 个答案:

答案 0 :(得分:4)

DBD::SQLite文档中,它说明了这一点:

  

这是因为DBD :: SQLite默认假定所有绑定值都是文本(并且应该引用)。

解决这个问题的方法是:

$r = $dbh->selectall_arrayref('select 123 where 5 > (?+0)', { Slice => {} }, 2)
    or die $dbh->errstr;

另一个可能更好的方法是在查询之前,甚至在连接时设置sqlite_see_if_its_a_number数据库句柄属性。

$dbh->{sqlite_see_if_its_a_number}=1;

答案 1 :(得分:3)

请改为尝试:

$r = $dbh->selectall_arrayref('select 123 where 5 > 0+?', { Slice => {} }, 2);

或者,执行:

my $sth = $dbh->prepare('select 123 where 5 > ?');
$sth->bind_param(1, 2, DBI::SQL_INTEGER);
$sth->execute;
$r = $sth->fetchall_arrayref({});