エラーモード属性PDO::ATTR_ERRMODEをPDO::ERRMODE_EXCEPTIONに設定する必要があります。
そして、prepare()メソッドによって例外がスローされることが予想されるため、PDO ::ATTR_EMULATE_PREPARES*機能を無効にする必要があります。 。それ以外の場合、MySQLサーバーは実行されるまでステートメントを「認識」しません。
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
}
catch(Exception $e) {
echo 'Exception -> ';
var_dump($e->getMessage());
}
プリント(私の場合)
Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found:
1146 Table 'test.doesnotexist' doesn't exist"
http://wezfurlong.org/blog/2006/apr/usingを参照してください-pdo-mysql /
EMULATE_PREPARES =trueは、現在pdo_mysqlドライバーのデフォルト設定のようです。それ以降、クエリキャッシュは修正/変更されており、mysqlndドライバーではEMULATE_PREPARES =falseに問題はありませんでした(ただし、 php愛好家だけです、私の言葉を信じないでください...)
*)次に、 PDO ::MYSQL_ATTR_DIRECT_QUERY -これら2つの属性の相互作用を(まだ?)理解していないことを認めなければならないので、次のように両方を設定します
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));