PDO 为您提供 3 种不同的错误处理策略,以适应您的应用程序开发风格。
在 PHP 8.0.0 之前,这是默认模式。PDO 仅设置错误代码,您可以使用 PDO::errorCode() 和 PDO::errorInfo() 方法在语句和数据库对象上检查;如果错误是由于对语句对象的调用导致的,则应调用该对象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果错误是由于对数据库对象的调用导致的,则应改为调用该数据库对象上的那些方法。
除了设置错误代码外,PDO 还将发出传统的 E_WARNING 消息。如果您只想查看发生了哪些问题而不中断应用程序的流程,则此设置在调试/测试期间很有用。
从 PHP 8.0.0 开始,这是默认模式。除了设置错误代码外,PDO 还将抛出 PDOException 并设置其属性以反映错误代码和错误信息。此设置在调试期间也很有用,因为它会在错误发生时有效地“炸毁”脚本,非常快地指出代码中潜在的问题区域(请记住:如果异常导致脚本终止,则事务会自动回滚)。
异常模式也很有用,因为与传统的 PHP 风格的警告相比,您可以更清晰地构建错误处理,并且与在静默模式下运行并显式检查每个数据库调用的返回值相比,代码/嵌套更少。
有关 PHP 中异常的更多信息,请参阅 异常。
PDO 标准化使用 SQL-92 SQLSTATE 错误代码字符串;各个 PDO 驱动程序负责将它们本地的代码映射到相应的 SQLSTATE 代码。 PDO::errorCode() 方法返回单个 SQLSTATE 代码。如果您需要有关错误的更具体信息,PDO 还提供了 PDO::errorInfo() 方法,它返回一个包含 SQLSTATE 代码、驱动程序特定错误代码和驱动程序特定错误字符串的数组。
示例 #1 创建 PDO 实例并设置错误模式
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 这将导致 PDO 抛出 PDOException(当表不存在时)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
上面的示例将输出
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10 Stack trace: #0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...') #1 {main} thrown in /tmp/pdo_test.php on line 10
注意:
PDO::__construct() 将始终抛出 PDOException,如果连接失败,无论当前设置了哪个
PDO::ATTR_ERRMODE
。
示例 #2 创建 PDO 实例并从构造函数中设置错误模式
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
// 这将导致 PDO 抛出级别为 E_WARNING 的错误,而不是异常(当表不存在时)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
上面的示例将输出
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 9