ZetCode

PHP PDO::errorInfo 方法

最后修改于 2025 年 4 月 19 日

PHP 中的 PDO::errorInfo 方法提供了 PDO 数据库句柄执行的最后一次操作的详细错误信息。它返回一个数组。

基本定义

PDO::errorInfo 获取与数据库句柄上最后一次操作相关的扩展错误信息。它返回一个包含错误信息的数组。

语法:public PDO::errorInfo(): array。该数组包含三个字段:SQLSTATE 错误代码、驱动程序特定的错误代码和错误消息。

基本的 errorInfo 示例

这展示了一个在使用 errorInfo 处理失败查询的简单示例。

pdo_errorinfo_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);
    
    $stmt = $pdo->query('SELECT * FROM non_existent_table');
    
    if ($stmt === false) {
        $error = $pdo->errorInfo();
        echo "SQLSTATE: {$error[0]}\n";
        echo "Driver Code: {$error[1]}\n";
        echo "Error Message: {$error[2]}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此示例尝试查询一个不存在的表。使用 ERRMODE_SILENT 时,错误不会抛出异常。errorInfo 提供详细的错误信息。

带预处理语句的 errorInfo

这演示了在预处理语句执行错误时使用 errorInfo。

pdo_errorinfo_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 (?, ?)');
    $result = $stmt->execute(['John Doe', 'invalid-email']);
    
    if ($result === false) {
        $error = $stmt->errorInfo();
        echo "Error: {$error[2]}\n";
        echo "SQLSTATE: {$error[0]}\n";
    } else {
        echo "Record inserted successfully\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这展示了带预处理语句的 errorInfo 用法。如果 execute 失败,errorInfo 会提供详细信息。请注意,我们使用的是语句的 errorInfo 方法。

比较 errorInfo 和 errorCode

此示例将 errorInfo 与更简单的 errorCode 方法进行比较。

pdo_errorinfo_vs_errorcode.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);
    
    $result = $pdo->exec('DELETE FROM non_existent_table');
    
    if ($result === false) {
        echo "errorCode: " . $pdo->errorCode() . "\n";
        
        $errorInfo = $pdo->errorInfo();
        echo "Full error info:\n";
        print_r($errorInfo);
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这显示了 errorCode 和 errorInfo 之间的区别。errorCode 只返回 SQLSTATE,而 errorInfo 以数组形式提供完整的错误详细信息。

带事务的 errorInfo

这演示了在事务失败时使用 errorInfo。

pdo_errorinfo_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();
    
    $result1 = $pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
    $result2 = $pdo->exec("UPDATE non_existent_table SET balance = balance + 100 WHERE user_id = 2");
    
    if ($result1 === false || $result2 === false) {
        $pdo->rollBack();
        $error = $pdo->errorInfo();
        echo "Transaction failed: {$error[2]}\n";
    } else {
        $pdo->commit();
        echo "Transaction completed successfully\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这展示了在事务上下文中 errorInfo 的用法。当一个查询失败时,我们回滚并使用 errorInfo 获取有关出错原因的详细信息。

特定于数据库的错误代码

此示例展示了 errorInfo 如何返回特定于驱动程序的错误代码。

pdo_errorinfo_driver_codes.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);
    
    // Attempt to violate a unique constraint
    $result = $pdo->exec("INSERT INTO users (email) VALUES ('duplicate@example.com')");
    
    if ($result === false) {
        $error = $pdo->errorInfo();
        echo "MySQL Error Code: {$error[1]}\n";
        echo "Error Message: {$error[2]}\n";
        
        // MySQL specific error code for duplicate entry
        if ($error[1] == 1062) {
            echo "Duplicate entry detected!\n";
        }
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这演示了如何使用特定于驱动程序的错误代码(数组索引 1)来检测特定错误条件,例如 MySQL 中的重复条目。

带不同数据库的 errorInfo

这展示了 errorInfo 如何与 SQLite 和 MySQL 配合使用。

pdo_errorinfo_multidb.php
<?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);
    
    $result = $mysql->exec("INVALID SQL");
    if ($result === false) {
        echo "MySQL Error:\n";
        print_r($mysql->errorInfo());
    }
} catch (PDOException $e) {
    echo "MySQL Error: " . $e->getMessage();
}

// SQLite example
try {
    $sqlite = new PDO('sqlite:/path/to/database.sqlite');
    $sqlite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    
    $result = $sqlite->exec("INVALID SQL");
    if ($result === false) {
        echo "\nSQLite Error:\n";
        print_r($sqlite->errorInfo());
    }
} catch (PDOException $e) {
    echo "SQLite Error: " . $e->getMessage();
}

这展示了 errorInfo 在不同数据库系统中的工作方式。虽然数组结构是一致的,但具体的代码和消息因驱动程序而异。

errorInfo 的最佳实践

来源

PHP PDO::errorInfo 文档

本教程介绍了 PDO::errorInfo 方法,并通过实际示例展示了如何在 PHP 中检索和解释数据库错误信息。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP PDO 函数