検討!目論見検討委員会

最近はコミケの締切情報メイン

mysqlのphpのpdoのプレースホルダに関するメモ

  • はまったので書き残しておく
  • テーブル名をプレースホルダにするとmysqlのsyntax errorが出る
    • 当たり前なのか?
  • 違ってたらツッコミ歓迎
$conn = new PDO(省略);
$sql = "INSERT INTO :tableName ( `id` , `name` ) VALUES ( :id , :values)";
$stmt = $conn->prepare($sql);
$arr = array('tableName' => 'SOME_TABLE' , 'id' => '1', 'values' => 'some string');
$stmt->execute($arr);
print_r($stmt->errorInfo());

ってやると、'SOME_TABLE'あたりでsyntax errorだとのたうち回る。
よく見ると、テーブル名をシングルクオートで囲っているのがエラーの原因らしく、

$tableName = "SOME_TABLE";
$sql = "INSERT INTO $tableName ( `id` , `date` ) VALUES ( :id , :values)";

などとしてやったらうまくいった。プレースホルダのそもそもの使い方を間違っているような気がした。

追記(9/23)

同じようなことなんだけど。mysqlの関数をプレースホルダに入れてやっても使えない。
こんな感じで配列作ってNOW()をクエリに渡そうとすると

$arr = array('tableName' => 'SOME_TABLE' , 'id' => '1', 'values' => 'NOW()');

関数が文字列になってしまい、クエリ自体が下記のようになる。

INSERT INTO SOME_TABLE ( `id` , `name` ) VALUES ( '1' , 'NOW()' )";

わざわざ全クエリをはき出して調べたんだから感謝しなさいうわなにをs(ry

SET GLOBAL general_log = 'ON';

※ただしmysql5.1.12以上に限る