2011-11-08 9 views
0

MySQL、Perlmysql perlプレースホルダルール

次の選択は、プレースホルダなしでうまく動作しますが、プレースホルダでは機能しません。 SQLエラーは生成されませんが、プレースホルダのない同じステートメントと同じカウントではなく、すべての空白/ゼロが戻されます。

my $sql="SELECT ?, SUM(IF(H1='1',1,0)) AS banner1 FROM table_name WHERE (?!='' and ? IS NOT NULL) GROUP BY ?"; 

my $sth = $dbh->prepare($sql); 

my $variable = "Q1"; 

$sth->execute($variable, $variable, $variable, $variable); 

私は間違っていますか?

プレースホルダを意図しない方法で使用しようとしていますか? WHERE句でプレースホルダのみを使用する場合に機能します。 SELECT句またはGROUP BY句でプレースホルダを使用すると機能しません。これは問題ですか?プレースホルダはWHERE句でのみ使用できますか?

答えて

3

SQLステートメントのSELECT部分にプレースホルダーを使用することはできません。これはthe documentationで説明されています。ほとんどのドライバーと

は、プレースホルダは、文を検証し、それのためのクエリ実行プランを作成するから、データベースサーバを妨げる文の任意の要素のために使用することはできません。たとえば:

"SELECT name, age FROM ?"   # wrong (will probably fail) 
"SELECT name, ? FROM people" # wrong (but may not 'fail') 
2

あなたは列または表の名前を代入するプレースホルダを使用することはできません。あなたのWHERE句でさえ、それはあなたが思っていることをしていない。プレースホルダのためQ1を代用すると、次のようになります。

すなわち常に真で表現
WHERE ('Q1'!='' and 'Q1' IS NOT NULL) 

関連する問題