0

我有这段代码:

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);
}

catch当我在 IDE 中使用调试器单步执行代码时,即使我的prepare语句中有错误,它也永远不会进入块。

我究竟做错了什么?

我是 PDO 的新手并尝试/捕获块,所以如果这是一个愚蠢的问题,请耐心等待!

4

3 回答 3

2

尝试添加$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

模拟的预处理语句不与数据库服务器通信,因此 PDO::prepare() 不检查语句。

参考: http: //php.net/manual/en/pdo.prepare.php

于 2012-09-18T14:13:42.090 回答
2

PDO_mysql 默认使用模拟的prepared statements(性能原因),因此prepare 不会抛出异常。PDOStatement::execute不过会。

您可以按照 jonnyynnoj 提到的方式关闭仿真,但我发现在执行时捕获异常通常就足够了。

于 2012-09-18T14:16:17.893 回答
0

try / catch 只会捕获异常。其他错误(解析错误、运行时错误等)不会执行 catch 块。

在您的情况下,只有“PDOException”类型的异常被捕获,其他所有内容都可能被显示或记录(取决于您在 php.ini 中的错误报告指令)。

什么显示为错误?

于 2012-09-18T14:15:03.333 回答