一畳のくつろぎタイム

このブログでは紹介する商品画像をAmazonアソシエイトより借りています。画像やリンクにはアフィリエイト広告が含まれる事があります

2018年4月24日火曜日

PDOで表の名前にはプレースホルダーが使えない

ダメなコード

    // PDOによる接続
    $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8','test','password');
    // DBエラーで例外を発生させる
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // プリペアステートメントのエスケープ設定
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    
    $stmh = $pdo->prepare("select * from :table");
    
    $stmh->bindValue(":table", "mytable");
    
    $stmh->execute();

show tableを実行して得た結果からテーブルを選ばせてその情報を取得しようとしたがSyntaxエラーとなる。

FROM句にプレースホルダーを使うことは少ないが、これはできないらしい。
自分で無害化するか、表名自体を表に出さないような作りにする必要がある。

参考
https://stackoverflow.com/questions/15182910/php-pdo-bind-table-name