PHP PDO::errorCode 方法
最后修改于 2025 年 4 月 19 日
PDO::errorCode 方法检索上次操作的 SQLSTATE 错误代码。它提供了一种在 PDO 中检查数据库操作错误的标准方法。
基本定义
PDO::errorCode 返回一个五字符的 SQLSTATE 代码,如果没有任何操作则返回 null。SQLSTATE 是 ANSI SQL 标准的数据库错误代码。该方法应用于数据库句柄,而不是单个语句。
语法:public PDO::errorCode(): ?string。该方法不接受任何参数,并返回一个字符串或 null。它不抛出异常。
基本的 errorCode 示例
这展示了 errorCode 最简单的错误检查用法。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
// Deliberate error - table doesn't exist
$pdo->query("SELECT * FROM non_existent_table");
$errorCode = $pdo->errorCode();
if ($errorCode !== '00000') {
echo "Error occurred: $errorCode";
}
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
这演示了使用 errorCode 进行基本的错误检查。我们设置 ERRMODE_SILENT 以防止异常。代码检查 errorCode 是否与 '00000'(成功)不同。
不同错误类型的 errorCode
此示例显示了 errorCode 对不同错误条件的响应。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
// Syntax error
$pdo->exec("SELECT FROM users");
echo "Syntax error: " . $pdo->errorCode() . "\n";
// Non-existent table
$pdo->exec("SELECT * FROM no_such_table");
echo "Table error: " . $pdo->errorCode() . "\n";
// Valid query
$pdo->exec("SELECT 1");
echo "Success: " . $pdo->errorCode() . "\n";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这显示了不同错误类型的不同错误代码。语法错误和缺少表会返回不同的 SQLSTATE 代码。成功的查询返回 '00000'。
errorCode 与 errorInfo 的区别
这比较了 errorCode 和更详细的 errorInfo 方法。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$pdo->exec("SELECT FROM users"); // Syntax error
echo "errorCode: " . $pdo->errorCode() . "\n";
$errorInfo = $pdo->errorInfo();
echo "errorInfo: \n";
print_r($errorInfo);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
errorCode 只返回 SQLSTATE,而 errorInfo 提供一个包含 SQLSTATE、驱动程序特定的错误代码和错误消息的数组。errorInfo 更详细,但 errorCode 对于基本检查更简单。
带事务的 errorCode
这演示了使用 errorCode 检查事务状态。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
if ($pdo->errorCode() !== '00000') {
$pdo->rollBack();
echo "First update failed";
exit;
}
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 999");
if ($pdo->errorCode() !== '00000') {
$pdo->rollBack();
echo "Second update failed";
exit;
}
$pdo->commit();
echo "Transaction completed successfully";
} catch (PDOException $e) {
$pdo->rollBack();
echo "Error: " . $e->getMessage();
}
这使用 errorCode 检查事务中的每个步骤。如果任何操作失败,事务将回滚。这可以确保在发生错误时数据的一致性。
数据库特定的错误代码
这显示了 errorCode 如何与不同的数据库系统一起使用。
<?php
declare(strict_types=1);
// MySQL error
try {
$mysql = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$mysql->exec("SELECT FROM users"); // Syntax error
echo "MySQL error: " . $mysql->errorCode() . "\n";
} catch (PDOException $e) {}
// SQLite error
try {
$sqlite = new PDO('sqlite::memory:');
$sqlite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$sqlite->exec("SELECT FROM non_existent");
echo "SQLite error: " . $sqlite->errorCode() . "\n";
} catch (PDOException $e) {}
不同的数据库系统可能对类似的错误返回不同的 SQLSTATE 代码。errorCode 方法提供了一种跨数据库检查这些代码的标准方法。
预处理语句中的 errorCode
这显示了带预处理语句的 errorCode 用法。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(['John Doe']); // Missing second parameter
if ($pdo->errorCode() !== '00000') {
echo "Prepare/execute error: " . $pdo->errorCode() . "\n";
print_r($pdo->errorInfo());
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这演示了检查预处理语句执行中的错误。该示例展示了如何使用 errorCode 和 errorInfo 来处理参数计数不匹配的问题。
使用 errorCode 进行自定义错误处理
这显示了使用 errorCode 实现自定义错误处理。
<?php
declare(strict_types=1);
function handlePdoError(PDO $pdo): void {
$errorCode = $pdo->errorCode();
if ($errorCode === '00000') return;
$errorMap = [
'42S02' => 'Table not found',
'42000' => 'Syntax error',
'23000' => 'Integrity constraint violation'
];
$message = $errorMap[$errorCode] ?? "Database error ($errorCode)";
echo "Error: $message\n";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$pdo->exec("SELECT FROM users"); // Will trigger error
handlePdoError($pdo);
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
这实现了一个自定义错误处理程序,该处理程序将 SQLSTATE 代码映射到友好的消息。该处理程序检查 errorCode 并提供适当的响应。
最佳实践
- 与 errorInfo 结合: 用于详细的错误诊断。
- 操作后检查: 验证每次调用的成功情况。
- 使用常量: 用于检查中常见的 SQLSTATE 代码。
- 记录代码: 维护一个预期的错误代码列表。
- 考虑异常: ERRMODE_EXCEPTION 可能更简单。
来源
本教程涵盖了 PDO::errorCode 方法,并通过实际示例展示了如何在不同的数据库操作场景中实现错误检查。
作者
列出 所有 PHP PDO 函数。