2024 PHP 日本大会

错误和错误处理

PDO 提供了三种不同的错误处理策略,以适应您的应用程序开发风格。

  • PDO::ERRMODE_SILENT

    在 PHP 8.0.0 之前,这是默认模式。PDO 只会设置错误代码,您可以使用语句和数据库对象上的 PDO::errorCode()PDO::errorInfo() 方法进行检查;如果错误是由语句对象上的调用引起的,则应在该对象上调用 PDOStatement::errorCode()PDOStatement::errorInfo() 方法。如果错误是由数据库对象上的调用引起的,则应改为在数据库对象上调用这些方法。

  • PDO::ERRMODE_WARNING

    除了设置错误代码外,PDO 还会发出传统的 E_WARNING 消息。如果您只想查看发生了哪些问题而不中断应用程序的流程,则此设置在调试/测试期间非常有用。

  • PDO::ERRMODE_EXCEPTION

    从 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

添加注释

用户贡献注释

此页面没有用户贡献的注释。
To Top