即使您的查詢成功,PDO::errorInfo() 仍然會返回一個陣列。對於 MySQL 5.x,我會得到以下結果...
陣列
(
[0] => 00000
[1] =>
[2] =>
)
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDOStatement::errorInfo — 取得與敘述句柄上最後一次操作相關聯的擴展錯誤資訊
此函式沒有參數。
PDOStatement::errorInfo() 會傳回一個關於此敘述句柄執行的最後一次操作的錯誤資訊陣列。 該陣列至少包含以下欄位
元素 | 資訊 |
---|---|
0 | SQLSTATE 錯誤碼(ANSI SQL 標準中定義的五個字元字母數字識別碼)。 |
1 | 驅動程式特定的錯誤碼。 |
2 | 驅動程式特定的錯誤訊息。 |
範例 #1 顯示 PDO_ODBC 連線到 DB2 資料庫的 errorInfo() 欄位
<?php
/* 觸發一個錯誤 -- BONES 資料表不存在 */
$sth = $dbh->prepare('SELECT skull FROM bones');
$sth->execute();
echo "\nPDOStatement::errorInfo():\n";
$arr = $sth->errorInfo();
print_r($arr);
?>
以上範例會輸出
PDOStatement::errorInfo(): Array ( [0] => 42S02 [1] => -204 [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704 )
即使您的查詢成功,PDO::errorInfo() 仍然會返回一個陣列。對於 MySQL 5.x,我會得到以下結果...
陣列
(
[0] => 00000
[1] =>
[2] =>
)
說真的,errorInfo 是你的好朋友。使用它。
如果這些看起來像你的 Google 搜尋,那麼你需要 errorInfo
「PHP 中沒有顯示資料庫錯誤」
「PDO 可以從資料庫中選取,但無法插入」
「PDO 插入無效」
「PDO 是否只是一個大炒作,我應該回到 mysql 嗎?」
「外科醫生賺多少錢?」
相信我,如果你養成在開發中使用它的習慣,它絕對可以幫你省下數小時的抓狂時間。忘記 E-ALL,它讓我失望了,因為 E-ALL 顯然不知道我沒有在我的 MySQL 資料表中設定預設值,而我的查詢也沒有向其中添加任何內容。所以請務必這樣做
<?php
$sql = '針對一個 mysql 資料表執行某些操作,條件是 foo = :bar';
$stmt = prepare($sql);
$stmt->bindValue(':bar', $foo, PDO::PARAM_[資料類型]);
$stmt->execute();
// 在開發過程中非常重要,但在正式環境中要移除
$foo_arr = $stmt->errorInfo();
print_r($foo_arr);
//print_r 範例回傳值
/*
Array(
[0] => HY000
[1] => 1364
[2] => 欄位 'phone' 沒有預設值
)
從來沒有這麼開心看到錯誤
*/
?>
雖然任何稱職的開發人員都會隨時注意並嘗試捕捉錯誤,但即使是最優秀的開發人員也會犯錯。這不能取代例外處理,但它的簡潔性是無價的。
可以在這裡找到 Ansi SQL 狀態錯誤碼
https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm