PHP错误处理在MySQL和MySQLi中工作,但不是PDO工作



我刚刚完成了将一堆MySQL和MySQLi表单重构为PDO。

一切似乎都在运转。

现在转到错误处理。

在MySQL/MySQLi代码中,我一直在使用if语句来捕捉错误。像这样:

if (!$database_connection) {    
// error handling here
}

简单明了。

但我无法获得类似的设置来与PDO合作。

这是一个场景:

我有一个到数据库的连接,看起来像这样:

$data_source_name = "mysql:host=$db_host;dbname=$db_name";
$database_connection = new PDO($data_source_name, $db_username, $db_password);

执行看起来像这样:

$stmt= $database_connection->prepare($sql);
$stmt->execute([$name, $email]);

我正在尝试设置一个类似上面描述的条件:

if ( database connection fails ) {
// error handling
}

但是这个代码不起作用。

if ( !$database_connection ) {
// error handling
} else {
$stmt= $database_connection->prepare($sql);
$stmt->execute([$name, $email]);
}

这个if构造在MySQL中工作(现在已弃用(,在MySQLi中工作,但在PDO中不工作。

我最初试图使用try-catch来完成这项工作,正如许多Stack文章中所建议的那样。但经过更多的研究,这个功能似乎不适合PDO异常。

欢迎提供任何指导和建议。谢谢

new PDO在连接失败时引发异常。使用异常处理程序:

try {
$database_connection = new PDO($data_source_name, $db_username, $db_password);
} catch (PDOException $e) {
// error handling
}

这是一个非常常见的谬论,即需要为PDO或Mysqli(或任何其他模块(提供专用的错误处理代码。至少它应该更加具体,例如";Mysqli连接";处理程序,就像您的旧mysqli代码一样。

如果你仔细想想,你真的不在乎这是否正是一个数据库错误阻止了代码表单的正确执行。也可能存在任何其他问题。

诚然,人们很难从这样一个简单的代码中预料到任何其他问题,但代码可能会增长,变得更加模块化,执行更多任务,因此在任何其他部分也会出错。比如,在每个文件中写入数据库凭据有点浪费。所以,将它们放在一个文件中,然后将其包含在需要数据库交互的其他脚本中是很自然的。因此,这个文件可能会被破坏,这将产生与数据库错误相同的效果。而且还需要修复。

或者,如果您只处理连接错误,那么问题也可能在查询执行过程中发生(尤其是在您的情况下,由于执行查询的方式,即使客户只输入fish'h'chips,它也会出错(。

你真正关心的是数据是否正确存储(可能还有电子邮件是否发送(,无论可能发生什么故障。这就是我在文章中写这篇警告的确切原因,不要为了报告这个特定的错误而将代码的某些特定部分包装在try-catch中。As错误报告处理程序必须对整个代码通用。

诚然,最简单的异常处理方法只是将整个代码封装在try-catch块中,其中必须检查最通用的异常类型,即Throwable。不是很可靠,但最简单。

这里的关键是包装整个代码,而不仅仅是其中的某个随机部分。但不要忘记为PDO设置异常模式,以便让查询执行错误也能在这个块中被捕获。

<?php
try {
require 'pdo.php'
...
$sql = "INSERT INTO other_choices (order,foods) VALUES (?,?)";
...
$stmt= $db_connection->prepare($sql);
$stmt->execute([$order, $foods]);
// send emails, etc
} catch (Throwable $e) {
// do your handling here
}

请注意,我用问号替换了查询中的实际变量,这是使用准备语句的正确方式,否则这些变量将变得毫无用处,并使您从mysqli的所有转换都毫无结果(尤其是考虑到mysqli也支持准备语句(。

不幸的是,PHP有两种错误——异常和固有错误。尝试接球只能接住前者。为了处理各种错误,可以使用错误处理程序。您可以在我关于PHP错误报告的文章中看到一个非常基本的例子。

最后一点:每次网站出现错误都发送电子邮件并不是最明智的做法。尽管在您的情况下,这是合理的,因为只有当用户提交表单时才会使用PHP,但在使用PHP处理每个页面的常规网站上,它可能会导致数千封电子邮件。或者,即使在您的情况下,垃圾邮件发送者也可能以您的表单为目标,并发送数千个请求(这本身可能会导致一些溢出错误,从而导致收件箱中出现数千封电子邮件(。与其手动发送电子邮件,不如考虑使用专用的错误监控软件,如Sentry。它将只发送新的错误,以及聚合的错误信息。

最新更新