-3

私はこのコードを持っています:

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 つのバインド変数で呼び出されました。

なんで?

4

2 に答える 2

6

リテラル'$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');
于 2013-10-18T17:55:16.957 に答える
6

厳密なおよび/または警告をオンにしていた場合は、問題が何であるかがわかります。

あなたが書いている

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

これは、ブランチ$sqlで宣言した変数がスコープ内になく、完全に空の SQL を実行しようとしていることを意味します。if

于 2013-10-18T17:56:31.897 に答える