PHP Conference Japan 2024

PDO::errorInfo

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::errorInfo 取得與資料庫控制碼上一次操作相關聯的擴展錯誤資訊

說明

public PDO::errorInfo(): 陣列

參數

此函式沒有參數。

傳回值

PDO::errorInfo() 傳回一個陣列,其中包含關於此資料庫控制碼執行的最後一個操作的錯誤資訊。 該陣列至少包含以下欄位:

元素 資訊
0 SQLSTATE 錯誤碼(ANSI SQL 標準中定義的五個字元字母數字識別碼)。
1 驅動程式特有的錯誤碼。
2 驅動程式特有的錯誤訊息。

注意:

如果 SQLSTATE 錯誤碼未設定或沒有驅動程式特定的錯誤,則元素 0 之後的元素將會被設定為 null

PDO::errorInfo() 只會擷取直接在資料庫控制器上執行的操作的錯誤資訊。如果您透過 PDO::prepare()PDO::query() 建立 PDOStatement 物件,並在敘述控制器上引發錯誤,PDO::errorInfo() 將不會反映來自敘述控制器的錯誤。您必須呼叫 PDOStatement::errorInfo() 才能返回在特定敘述控制器上執行的操作的錯誤資訊。

範例

範例 #1 顯示 PDO_ODBC 連線到 DB2 資料庫的 errorInfo() 欄位

<?php
/* 觸發錯誤 -- 錯誤的 SQL 語法 */
$stmt = $dbh->prepare('bogus sql');
if (!
$stmt) {
echo
"\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
?>

以上範例將會輸出

PDO::errorInfo():
Array
(
    [0] => HY000
    [1] => 1
    [2] => near "bogus": syntax error
)

另請參閱

新增註釋

使用者貢獻的註釋 3 則註釋

alagar86 at gmail dot com
13 年前
請注意:如果 PDO::ATTR_EMULATE_PREPARES 為 true,此範例將無法運作。

您應該將其設定為 false

<?php
$dbh
->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $dbh->prepare('bogus sql');
if (!
$stmt) {
echo
"\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
?>
quickshiftin at gmail dot com
17 年前
以下是來自 SQLite 官網的 SQLite 錯誤碼

SQLite 版本 3 的錯誤碼與版本 2 相同。它們如下:
#define SQLITE_OK 0 /* 操作成功 */
#define SQLITE_ERROR 1 /* SQL 錯誤或缺少資料庫 */
#define SQLITE_INTERNAL 2 /* SQLite 內部邏輯錯誤 */
#define SQLITE_PERM 3 /* 拒絕存取權限 */
#define SQLITE_ABORT 4 /* 回呼常式要求中止 */
#define SQLITE_BUSY 5 /* 資料庫檔案已鎖定 */
#define SQLITE_LOCKED 6 /* 資料庫中的表格已被鎖定 */
#define SQLITE_NOMEM 7 /* 記憶體配置 (malloc()) 失敗 */
#define SQLITE_READONLY 8 /* 嘗試寫入唯讀資料庫 */
#define SQLITE_INTERRUPT 9 /* 操作被 sqlite_interrupt() 中斷 */
#define SQLITE_IOERR 10 /* 發生某種磁碟 I/O 錯誤 */
#define SQLITE_CORRUPT 11 /* 資料庫磁碟映像損毀 */
#define SQLITE_NOTFOUND 12 /* (僅限內部使用) 找不到表格或記錄 */
#define SQLITE_FULL 13 /* 插入失敗,因為資料庫已滿 */
#define SQLITE_CANTOPEN 14 /* 無法開啟資料庫檔案 */
#define SQLITE_PROTOCOL 15 /* 資料庫鎖定協定錯誤 */
#define SQLITE_EMPTY 16 /* (僅限內部使用) 資料庫表格為空 */
#define SQLITE_SCHEMA 17 /* 資料庫結構已變更 */
#define SQLITE_TOOBIG 18 /* 表格一列的資料過多 */
#define SQLITE_CONSTRAINT 19 /* 因違反約束條件而中止 */
#define SQLITE_MISMATCH 20 /* 資料類型不符 */
#define SQLITE_MISUSE 21 /* 程式庫使用不正確 */
#define SQLITE_NOLFS 22 /* 使用主機不支援的作業系統功能 */
#define SQLITE_AUTH 23 /* 授權被拒 */
#define SQLITE_ROW 100 /* sqlite_step() 已準備好另一列資料 */
#define SQLITE_DONE 101 /* sqlite_step() 已完成執行 */
mazen at mindcraftinc dot com
16 年前
某些 PDO 驅動程式會返回更大的陣列。例如,SQL Server 驅動程式會返回 5 個值。

例如
<?php
$numRows
= $db->exec("DELETE FROM [TableName] WHERE ID between 6 and 17");
print_r($db->errorInfo());
?>

結果

陣列
(
[0] => 00000
[1] => 0
[2] => (null) [0] (嚴重性 0) []
[3] => 0
[4] => 0
)
To Top