PDO::errorInfo

Pobieranie sterownika PHP

Pobiera rozszerzone informacje o błędach najnowszej operacji na uchwytie bazy danych.

Syntax

array PDO::errorInfo();  

Wartość zwracana

Tablica informacji o błędach dotyczących najnowszej operacji na ręce bazy danych. Tablica składa się z następujących pól:

  • Kod błędu SQLSTATE.

  • Kod błędu specyficzny dla sterownika.

  • Komunikat o błędzie specyficznym dla sterownika.

Jeśli nie ma błędu lub SQLSTATE nie jest ustawiony, to pola specyficzne dla sterownika są NULL.

Remarks

PDO::errorInfo pobiera informacje o błędzie tylko dla operacji wykonanych bezpośrednio w bazie danych. Używaj PDOStatement::errorInfo, gdy instancja PDOStatement jest tworzona za pomocą PDO::p repare lub PDO::query.

Wsparcie dla PDO zostało dodane w wersji 2.0 sterowników Microsoft dla PHP dla SQL Server.

Example

W tym przykładzie nazwa kolumny jest błędnie napisana (Cityx zamiast ), Cityco powoduje błąd, który następnie jest zgłaszany.

<?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());  
?>  

Dodatkowe wiadomości ODBC

Gdy wystąpi wyjątek, sterownik ODBC może zwracać więcej niż jeden błąd, aby pomóc w diagnozowaniu problemów. Jednak PDO::errorInfo zawsze pokazuje tylko pierwszy błąd. W odpowiedzi na ten zgłoszenie błędu, PDO::errorInfo i PDOStatement::errorInfo zostały zaktualizowane, aby wskazać, że sterowniki powinny wyświetlać co najmniej następujące trzy pola:

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.

Począwszy od wersji 5.9.0, domyślne zachowanie PDO::errorInfo polega na wyświetlaniu dodatkowych błędów ODBC, jeśli są dostępne. Przykład:

<?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);
}
?>  

Uruchomienie powyższego skryptu powinno wywołać wyjątek, a wynik wygląda tak:

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."
}

Jeśli użytkownik woli poprzednią metodę, można użyć nowej opcji pdo_sqlsrv.report_additional_errors konfiguracji, aby ją wyłączyć. Wystarczy dodać następujący wiersz na początku dowolnego skryptu PHP:

ini_set('pdo_sqlsrv.report_additional_errors', 0);

W tym przypadku informacje o błędzie wyświetlane będą następujące, gdy uruchamiamy ten sam przykładowy skrypt:

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'."
}

W razie potrzeby użytkownik może dodać następującą linię do pliku php.ini, aby wyłączyć tę funkcję we wszystkich swoich skryptach PHP:

pdo_sqlsrv.report_additional_errors = 0

Ostrzeżenia i błędy

Począwszy od wersji 5.9.0, ostrzeżenia ODBC nie będą już rejestrowane jako błędy. Oznacza to, że kody błędów z prefiksem "01" są rejestrowane jako ostrzeżenia. Innymi słowy, jeśli użytkownik chce rejestrować tylko błędy, zaktualizuj php.ini w następujący sposób:

[pdo_sqlsrv]  
pdo_sqlsrv.log_severity = 1

W takim przypadku plik logu nie będzie zawierał żadnych komunikatów ostrzegawczych. Proszę sprawdzić, jak działa logowanie dla pdo_sqlsrv użytkowników.