遅ればせながらMysqlをPDOで動かすように心を決めて、8時間が経過しました。早速、引っかかりまくりの憎悪渦巻く殺伐とした精神状態です。
そんな状態の私が、同じ状態になっているPDO初心者に役立つ情報をお送りします。
私は名前付きプレースホルダを使いたい人ですが、その場合、変数をバインドする必要があります。バインドする時には以下のように指定しますが、これをテーブル名でもやってみたのです。
$ins= $pdo->prepare('INSERT INTO :DB_table_name (name,age,category) VALUES (:name,:age,:category)'); $ins->bindParam(':DB_table_name', $DB_table_name, PDO::PARAM_STR); $ins->bindParam(':name', $name, PDO::PARAM_STR); $ins->bindParam(':age', $age, PDO::PARAM_INT); $ins->bindParam(':category', $category, PDO::PARAM_STR); $ins->execute();
この状態だとエラーを吐きます。
エラーの内容は以下。
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test_table' (name,age,sex,category) VALUES ('test_name','50','men','category' at line 1
ざっくりエラーの内容を説明すると、「構文が間違っとるばい!Mysqlのバージョン確認してマニュアル読んで出直してこい!」ってな感じ。
エラーの原因は、PDOStatement(bindParam)はカラムの値に使用するものでテーブルには使えないというのが答え。
エラーを出さずに実行するためにはテーブル名のバインドをやめて、直接埋め込むしかありません。
$ins= $pdo->prepare('INSERT INTO '.$DB_table_name.' (name,age,category) VALUES (:name,:age,:category)'); $ins->bindParam(':name', $name, PDO::PARAM_STR); $ins->bindParam(':age', $age, PDO::PARAM_INT); $ins->bindParam(':category', $category, PDO::PARAM_STR); $ins->execute();
これでエラーを出さずに値をインサートすることが出来ました。
う~ん。実はエラー出させるのにも設定が必要だから、エラー出力させるのにも苦労してます(笑)