我有这段代码:
try {
$dbh = new PDO('mysql:host='.$db_host.';dbname='.$db_database, $db_user, $db_pass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$dbh->prepare('DELECT userID FROM tblusers');
} catch (PDOException $e) {
echo "Error!: " . $e->getMessage() . "<br/>";
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
当我在IDE中使用调试器逐步执行代码时,即使我的catch
语句中有错误,它也永远不会进入prepare
块。
我做错了什么?
我是PDO的新手并尝试/捕获块,所以如果这是一个愚蠢的问题,请耐心等待我!
答案 0 :(得分:2)
尝试添加$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
模拟的预处理语句不与数据库服务器通信,因此PDO :: prepare()不检查语句。
答案 1 :(得分:2)
PDO_mysql默认使用模拟的预准备语句(性能原因),因此prepare不会抛出异常。 PDOStatement::execute
会尽力。
你可以通过像jonnyynnoj提到的那样关闭emmulation,但我发现在执行时捕获异常通常已经足够了。
答案 2 :(得分:0)
try / catch只会捕获异常。其他错误(解析错误,运行时错误等)不会执行catch-block。
在您的情况下,只有“PDOException”类型的异常被捕获,其他所有内容都可能被显示或记录(取决于您在php.ini中的错误报告指令)。
什么显示为错误?