【问题标题】:perl DBI execute doesn't recognize '?'perl DBI 执行不识别“?”
【发布时间】:2013-10-27 15:40:37
【问题描述】:

我有这个代码:

if($update[$entity_id])
{
    my $sql = "UPDATE cache SET date = '?', value = '?' WHERE item_id = ? AND level = ? AND type = ?;";
}
else
{
    my $sql = "INSERT INTO cache (date, value, item_id, level, type) VALUES ('?','?',?,?,?);";
}
my $db = $self->{dbh}->prepare(q{$sql}) or die ("unable to prepare");
$db->execute(time2str("%Y-%m-%d %X", time), $stored, $entity_id, 'entity', 'variance');

但是当它想要运行更新时,我得到了这个错误:

DBD::Pg::st 执行失败:在需要 0 时使用 5 个绑定变量调用。

为什么?

【问题讨论】:

  • $stored变量中为文本,可以包含空格,日期中也有空格,所以需要。
  • 不,你不需要它。这就是占位符的意义所在。
  • 好的,我删除了它们,但仍然是同样的错误......
  • 不,要么您没有删除它们,要么您没有收到相同的错误。显示代码。
  • 同时从->execute(q{$sql}) 中删除 q{}。你认为q{...} 会做什么?

标签: database perl postgresql dbd dbd-pg


【解决方案1】:

如果您打开了严格和/或警告,您会看到问题所在。

你在写

if (...) {
    my $sql = ...;
} else {
    my $sql = ...;
}
execute($sql);

这意味着您在if 分支中声明的$sql 变量不在作用域内,并且您正在尝试执行完全空的SQL。

【讨论】:

  • 当然,这是最大的问题。但是所有的回答都很有帮助,谢谢大家
【解决方案2】:

您正在准备文字 '$sql',但这不是您唯一的问题,词法 $sql 变量超出了 {} 的范围。

试试,

use strict;
use warnings;
#...

my $sql;
if($update[$entity_id])
{
    $sql = "UPDATE cache SET date = ?, value = ? WHERE item_id = ? AND level = ? AND type = ?";
}
else
{
    $sql = "INSERT INTO cache (date, value, item_id, level, type) VALUES (?,?,?,?,?)";
}
my $st = $self->{dbh}->prepare($sql) or die ("unable to prepare");
$st->execute(time2str("%Y-%m-%d %X", time), $stored, $entity_id, 'entity', 'variance');

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2021-04-30
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多