ZetCode

PHP PDO::errorCode 方法

最后修改于 2025 年 4 月 19 日

PDO::errorCode 方法检索上次操作的 SQLSTATE 错误代码。它提供了一种在 PDO 中检查数据库操作错误的标准方法。

基本定义

PDO::errorCode 返回一个五字符的 SQLSTATE 代码,如果没有任何操作则返回 null。SQLSTATE 是 ANSI SQL 标准的数据库错误代码。该方法应用于数据库句柄,而不是单个语句。

语法:public PDO::errorCode(): ?string。该方法不接受任何参数,并返回一个字符串或 null。它不抛出异常。

基本的 errorCode 示例

这展示了 errorCode 最简单的错误检查用法。

pdo_errorcode_basic.php
<?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 对不同错误条件的响应。

pdo_errorcode_types.php
<?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 方法。

pdo_errorcode_vs_errorinfo.php
<?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 检查事务状态。

pdo_errorcode_transaction.php
<?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 如何与不同的数据库系统一起使用。

pdo_errorcode_databases.php
<?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 用法。

pdo_errorcode_prepared.php
<?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 实现自定义错误处理。

pdo_errorcode_custom.php
<?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 并提供适当的响应。

最佳实践

来源

PHP PDO::errorCode 文档

本教程涵盖了 PDO::errorCode 方法,并通过实际示例展示了如何在不同的数据库操作场景中实现错误检查。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP PDO 函数