perl sqlite dbi - bind_value似乎没有日期,在硬编码时起作用

时间:2014-09-18 01:05:21

标签: perl sqlite

我使用Perl的DBI和sqlite。

问题在于通过使用bind_value传递值来使用selectrow_hashref。我有一个朱利安日期的领域。当我将日期的值直接放入调用中时,它可以正常工作。如果我尝试在bind_value中使用该值,它就不起作用。我知道我已经关闭,因为当我使用不同的密钥进行查询时,我可以使用bind_value。您可以在下面的调试器中看到代码。

有什么建议吗?

这有效:

  DB<20> $hash_ref = $dbh->selectrow_hashref("select * from run_data  where date = '$date'")

  DB<21> x $hash_ref
  0  HASH(0x3e8ad28)
   'date' => '2014-09-17 17:35:28'
   'kit' => '15.1.0.40'
   'run_id' => 1

这个没有,只是添加了?并将日期移至bind_value

  DB<22> $hash_ref = $dbh->selectrow_hashref("select * from run_data  where date = '?'", undef, $date)

  DB<23> x $hash_ref
  0  undef
  DB<24> 

这可行,但它使用整数键

  DB<24> $hash_ref = $dbh->selectrow_hashref("select * from run_data  where run_id = ?", undef, 1)

  DB<25> x $hash_ref
  0  HASH(0x3e8b0d0)
   'date' => '2014-09-17 17:35:28'
   'kit' => '15.1.0.40'
   'run_id' => 1

更新

睡觉后,我发现bind_value是一个数组。所以我试过了:

$hash_ref = $dbh->selectrow_hashref("select run_id from run_data where date = ?", undef, ($date));

这是有效的。所以没有引号,并确保我使用数组。

我很好奇为什么$ DBI :: errstr没有值,你会认为数据格式不正确。我将尝试使用RaiseError运行,看看会发生什么。

2 个答案:

答案 0 :(得分:1)

'?'表示&#34;由字符?组成的字符串。删除引号。

my $hash_ref = $dbh->selectrow_hashref(
   "select * from run_data  where date = ?", undef, $date);

答案 1 :(得分:0)

尝试类似的事情:

$sth = $dbh->prepare(qq(SELECT * FROM run_data WHERE run_id=(?) ));
$sth->execute($date) or die "Some message";