PDO 提供了三种不同的错误处理策略,以适应您的应用程序开发风格。
在 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() 如果连接失败,无论当前设置了哪个
PDO::ATTR_ERRMODE
,都会始终抛出 PDOException。
示例 #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