【问题标题】:PDO PHP Uncaught exceptionPDO PHP 未捕获的异常
【发布时间】:2012-04-12 13:52:06
【问题描述】:

我目前已切换到使用 PDO,但在处理异常时遇到了麻烦。连接正确,查询工作完美,但是当我故意犯错误时,错误并没有按我的预期处理。

我已将查询中的表名更改为不存在的表。从下面看到的代码中,我希望页面打印出“数据库错误”,但会得到可怕的橙色错误说...

'未捕获的异常'PDOException'和消息'SQLSTATE [42S02]:未找到基表或视图:1146 表'test.post'不存在'在 C:\wamp\www\website\functions.php 上第 46 行'

这是连接数据库时的代码...

$hostname = 'localhost';
$username = '';
$password = '';
try{
    $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
     print ("Database Error");
}

是我犯了错误还是有不同的方法来处理 PDO 错误?

【问题讨论】:

  • 如果您只是尝试捕获常规的Exception 而不是PDOException,会发生什么?
  • 查询在哪里?那是引发异常的地方,而不是在连接点。
  • 您在命名空间中工作吗?常见的错误是你需要抓住\YourException
  • 我已更改为 Exception 但这没有效果...我将更新代码并包含查询
  • 显示 C:\wamp\www\website\functions.php 第 46 行附近的行。我的猜测是你没有尝试/赶上那里。

标签: php pdo


【解决方案1】:

连接后,需要设置错误处理:

$dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

编辑:请注意,异常会在它被抛出的地方被捕获,所以你需要在查询周围放置一个try catch 块,你在连接时使用的那个只捕获那里有例外(如果有,请参阅@Crontab 的评论)。

【讨论】:

  • 除非错误发生在创建对象时,所以事后设置属性将无济于事。
  • 我已按照建议修改了代码,但同样的错误仍然存​​在
  • @Crontab 当然是这样,但这并不真正适用于 OP 谈论查询的情况。
  • @jeroen 啊,我明白你的意思了。他省略了代码的实际查询部分,我在他的错误中没有看到test.post。我的错。
  • 啊,好的,非常感谢,我一直关注的教程只显示了连接数据库时的 try/catch,因此我认为这已经足够了......非常感谢您的快速响应
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多