PDO::errorInfo
擷取資料庫控制代碼上最近作業的延伸錯誤資訊。
語法
array PDO::errorInfo();
傳回值
關於資料庫控制代碼上最近作業的錯誤資訊陣列。 此陣列包含下列欄位:
SQLSTATE 錯誤碼。
驅動程式特有的錯誤碼。
驅動程式特有的錯誤訊息。
如果沒有發生錯誤,或如果未設定 SQLSTATE,則驅動程式特定欄位會是 NULL。
備註
PDO::errorInfo 只會針對直接在資料庫上執行的作業擷取錯誤資訊。 使用 PDO::prepare 或 PDO::query 建立 PDOStatement 執行個體時,請使用 PDOStatement::errorInfo。
PDO 支援已新增至 Microsoft Drivers for PHP for SQL Server 2.0 版。
範例
在此範例中,資料行名稱的拼字錯誤 (Cityx
而不是 City
),因而導致錯誤並隨之進行報告。
<?php
$conn = new PDO( "sqlsrv:server=(local) ; Database = AdventureWorks ", "");
$query = "SELECT * FROM Person.Address where Cityx = 'Essen'";
$conn->query($query);
print $conn->errorCode();
echo "\n";
print_r ($conn->errorInfo());
?>
其他 ODBC 訊息
發生例外狀況時,ODBC 驅動程式可能會傳回多個錯誤,以協助診斷問題。 不過,PDO::errorInfo 一律只顯示第一個錯誤。 為了回應這個錯誤報表,PDO::errorInfo 和 PDOStatement::errorInfo 已更新,指出驅動程式應該至少顯示下列三個欄位:
0 SQLSTATE error code (a five characters alphanumeric identifier defined in the ANSI SQL standard).
1 Driver specific error code.
2 Driver specific error message.
從 5.9.0 開始,PDO::errorInfo 的預設行為是顯示其他 ODBC 錯誤 (如果有的話)。 例如:
<?php
try {
$conn = new PDO("sqlsrv:server=$server;", $uid, $pwd);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SET NOCOUNT ON; USE $database; SELECT 1/0 AS col1");
$stmt->execute();
} catch (PDOException $e) {
var_dump($e->errorInfo);
}
?>
執行上述指令碼應會擲回例外狀況,輸出則如下所示:
array(6) {
[0]=>
string(5) "01000"
[1]=>
int(5701)
[2]=>
string(91) "[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to 'tempdb'."
[3]=>
string(5) "22012"
[4]=>
int(8134)
[5]=>
string(87) "[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Divide by zero error encountered."
}
如果使用者偏好過去的方式,可以使用新的設定選項 pdo_sqlsrv.report_additional_errors
關閉此功能。 只要在任何 php 指令碼的開頭新增下行內容即可:
ini_set('pdo_sqlsrv.report_additional_errors', 0);
在此情況下,執行相同的範例指令碼時,會顯示如下的錯誤資訊:
array(3) {
[0]=>
string(5) "01000"
[1]=>
int(5701)
[2]=>
string(91) "[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to 'tempdb'."
}
如有必要,使用者可以選擇在 php.ini 檔案中新增下行內容,以關閉所有 php 指令碼的這項功能:
pdo_sqlsrv.report_additional_errors = 0
警告和錯誤
從 5.9.0 開始,ODBC 警告將不再記錄為錯誤。 亦即,前置詞 "01" 的錯誤碼會記錄為警告。 換句話說,如果使用者只想記錄錯誤,請如下所示更新 php.ini:
[pdo_sqlsrv]
pdo_sqlsrv.log_severity = 1
如此一來,記錄檔將不會包含任何警告訊息。 請檢查 pdo_sqlsrv 使用者的記錄運作方式。