PHP PDOStatement::errorCode 方法
最后修改于 2025 年 4 月 19 日
PDOStatement::errorCode 方法检索语句句柄上最后一次操作的 SQLSTATE 错误代码。它有助于错误处理。
基本定义
PDOStatement::errorCode 返回一个五字符的 SQLSTATE 代码。此代码标识最后一次操作期间发生的错误的类型。
值为 '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);
$stmt = $pdo->prepare('SELECT * FROM non_existent_table');
$stmt->execute();
$errorCode = $stmt->errorCode();
if ($errorCode !== '00000') {
echo "Error occurred: $errorCode";
}
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
此代码尝试查询一个不存在的表。我们将 ERRMODE_SILENT 设置为防止异常。errorCode 方法捕获 SQLSTATE 错误代码。
带无效查询的 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('SELEC * FROM users'); // Invalid SQL
$stmt->execute();
$errorCode = $stmt->errorCode();
if ($errorCode !== '00000') {
echo "SQL Error: $errorCode";
}
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
SQL 语句包含语法错误(SELEC 而不是 SELECT)。errorCode 返回此语法错误的特定 SQLSTATE 代码。
带参数绑定的 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->bindValue(1, 'John Doe');
// Intentionally skip binding the second parameter
$stmt->execute();
$errorCode = $stmt->errorCode();
if ($errorCode !== '00000') {
echo "Binding Error: $errorCode";
}
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
我们故意跳过第二个参数的绑定,以演示 errorCode 如何捕获参数绑定错误。SQLSTATE 代码将指示缺少参数。
带事务的 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();
// First insert succeeds
$stmt1 = $pdo->prepare('INSERT INTO users (id, name) VALUES (?, ?)');
$stmt1->execute([1, 'John']);
// Second insert fails due to duplicate ID
$stmt2 = $pdo->prepare('INSERT INTO users (id, name) VALUES (?, ?)');
$stmt2->execute([1, 'Jane']);
$errorCode = $stmt2->errorCode();
if ($errorCode !== '00000') {
echo "Duplicate entry error: $errorCode";
$pdo->rollBack();
}
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
第二次插入违反了主键约束。errorCode 捕获此特定错误,允许我们在代码中适当地处理它。
不同数据库系统的 errorCode
此示例演示了 SQLite 与 MySQL 在 errorCode 行为上的差异。
<?php
declare(strict_types=1);
// MySQL example
try {
$mysql = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$stmt = $mysql->prepare('SELECT * FROM non_existent_table');
$stmt->execute();
echo "MySQL error code: " . $stmt->errorCode() . "\n";
} catch (PDOException $e) {
echo "MySQL connection error: " . $e->getMessage();
}
// SQLite example
try {
$sqlite = new PDO('sqlite:test.db');
$sqlite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$stmt = $sqlite->prepare('SELECT * FROM non_existent_table');
$stmt->execute();
echo "SQLite error code: " . $stmt->errorCode() . "\n";
} catch (PDOException $e) {
echo "SQLite connection error: " . $e->getMessage();
}
不同的数据库系统可能对相似的错误返回不同的 SQLSTATE 代码。此示例展示了如何在系统之间一致地处理错误。
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);
$stmt = $pdo->prepare('INSERT INTO non_existent_table (name) VALUES (?)');
$stmt->execute(['Test']);
// Get just the SQLSTATE code
$errorCode = $stmt->errorCode();
echo "Error Code: $errorCode\n";
// Get full error information
$errorInfo = $stmt->errorInfo();
echo "Full Error Info:\n";
print_r($errorInfo);
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
errorCode 仅返回 SQLSTATE 代码,而 errorInfo 返回一个包含代码、驱动程序特定错误代码和错误消息的数组。使用 errorCode 进行简单检查,使用 errorInfo 进行详细诊断。
使用 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 (email) VALUES (?)');
$stmt->execute(['invalid_email']); // Assuming email has validation
$errorCode = $stmt->errorCode();
switch ($errorCode) {
case '00000':
echo "Success! Record inserted.\n";
break;
case '23000': // Integrity constraint violation
echo "Error: Duplicate or invalid data.\n";
break;
case '42000': // Syntax error or access violation
echo "Error: SQL syntax problem.\n";
break;
case 'HY000': // General error
echo "Error: General database error.\n";
break;
default:
echo "Unknown error occurred: $errorCode\n";
}
} catch (PDOException $e) {
echo "Connection error: " . $e->getMessage();
}
此示例演示了使用 switch 语句处理不同错误代码的实用方法。每个 SQLSTATE 代码都可以触发适合应用程序的特定错误处理逻辑。
最佳实践
- 检查错误代码:始终验证操作是否成功。
- 结合异常使用:同时使用两者以实现健壮的错误处理。
- 记录错误代码:记下您的应用程序处理了哪些代码。
- 测试错误场景:确保您的代码能妥善处理它们。
- 使用常量:为代码中常见的 SQLSTATE 代码使用常量。
来源
PHP PDOStatement::errorCode 文档
本教程介绍了 PDOStatement::errorCode 方法,并通过实际示例展示了其在不同数据库错误场景下的用法。
作者
列出 所有 PHP PDO 函数。