このページは、PHPの PDO::prepare() に不正なSQLを渡したときの挙動について検証してまとめたページです。
注意
- 下記のバージョンで検証したものです。別のバージョンや組み合わせでは違う動作になるかもしれません。
- PHP 8.1 + MySQL 8.0.31
- PHP 8.1 + MariaDB 10.10.2
- PHP 8.1 + PostgreSQL 15.1
- PHP 8.1 + SQLite 3.34.1
検証結果
環境 |
挙動 (結果) |
MySQL (PDO::ATTR_EMULATE_PREPARES => true) |
エラーにならない |
〃 (PDO::ATTR_EMULATE_PREPARES => false) |
構文エラー |
MariaDB (PDO::ATTR_EMULATE_PREPARES => true) |
エラーにならない |
〃 (PDO::ATTR_EMULATE_PREPARES => false) |
構文エラー |
PostgreSQL |
エラーにならない |
SQLite |
構文エラー |
- エラーになっていない環境では、
prepare()
の時点ではまだ各DB側にSQLが渡っていません。
prepare()
でエラーにならない場合でも、execute()
ではエラーになります。(各DB側にSQLが渡るため)
- PostgreSQL, SQLiteでは
PDO::ATTR_EMULATE_PREPARES
は利用できません。
MySQL, MariaDB (PDO::ATTR_EMULATE_PREPARES => true)
MySQL, MariaDB (PDO::ATTR_EMULATE_PREPARES => false)
ソース
PostgreSQL
ソース
SQLite
ソース