2013-10-18 7 views
-3

이 코드가 있습니다perl DBI execute가 '?'을 인식하지 못합니다.

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 execute failed : called with 5 bind variables when 0 are needed.

왜?

+4

각'? '주위에 작은 따옴표를 정말로 넣으시겠습니까? $ stored 변수에있는 – toolic

+0

은 공백을 포함 할 수있는 텍스트이며, 날짜에도 공백이 필요하므로 필요합니다. –

+4

아니요, 필요하지 않습니다. 그것은 자리 표시 자입니다. –

답변

6

, 당신은 당신의 문제가 무엇인지 볼 것입니다.

당신은 당신이 if 가지 에 선언 $sql 변수 범위에없는 당신이 완전히 비어 SQL을 실행하기 위해 노력하고 있음을 의미

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

을 쓰고있어.

+1

물론, 이것이 가장 큰 문제였습니다. 그러나 모든 대답은 도움이되었다. 모두에게 감사한다. –

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'); 
관련 문제