PDOでテーブル名が変数で使えないのはPDOStatementがサポートしていないから

PDOでテーブル名を変数で指定して実行するとエラーを出力することが分かりました。テーブル名をPDOStatementでバインドすることは出来ません。
 

遅ればせながらMysqlをPDOで動かすように心を決めて、8時間が経過しました。早速、引っかかりまくりの憎悪渦巻く殺伐とした精神状態です。

そんな状態の私が、同じ状態になっているPDO初心者に役立つ情報をお送りします。

 

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)はカラムの値に使用するものでテーブルには使えないというのが答え。

PDOの正しい書き方

エラーを出さずに実行するためにはテーブル名のバインドをやめて、直接埋め込むしかありません。

$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();

これでエラーを出さずに値をインサートすることが出来ました。

う~ん。実はエラー出させるのにも設定が必要だから、エラー出力させるのにも苦労してます(笑)

投稿日: 2017/10/14
 
筆者のご紹介
角政典@moreiic
真性のお家大好きフリーランスです。プログラムよりご飯の方が断然好き!博多出身のデブデザイナー。インドアだけど遊んでくれる人募集中!
よく検索されてる記事