Share via


PDO::errorInfo

下載 PHP 驅動程式

擷取資料庫控制代碼上最近作業的延伸錯誤資訊。

語法

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::errorInfoPDOStatement::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 使用者的記錄運作方式。

另請參閱

PDO 類別

PDO

PDOStatement::errorInfo