コトの発端
PHPのPDO経由でデータベースにアクセスするときに、特に指定しないとPHP側にてプリペアドステートメントがエミュレートされてクエリの作成が行われる。(動的プレースホルダ)
クエリの準備はDB側で行われた方(静的プレースホルダ)が仕組み上安全な気がするので、PHP側にてエミュレートされないようにしたい。
エミュレートをオフにする方法をいつも忘れてググってるので記録しておく。
解決編
PDOのインスタンス作成時に「PDO::ATTR_EMULATE_PREPARES => false」を下記の通り指定しよう。
$dbh = new PDO($dsn, $user,$password,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false));
本当にプリペアドステートメントがDBで実行されているかどうかについては、詳細ログを有効にしてPrepareされてからExecuteされているかを確認するとよい。
ワイのMariaDB環境で詳細ログを確認したところ、正常にPrepareからのExecuteされている様子であった。
参考
【PHP】PDOの静的プレースホルダと動的プレースホルダの違いを確認する
https://qiita.com/7968/items/7ddd59b94eb5a4fb6eaf
MySQLのログについて確認する
https://qiita.com/toshihirock/items/a97d174be68f485fbbf2
いつもの
記事の正確性については無保証です。