PDO::errorInfo

PHP-illesztőprogram letöltése

Lekéri a legutóbbi művelet kiterjesztett hibaadatait az adatbázis fogantyúján.

Syntax

array PDO::errorInfo();  

Visszaadott érték

Egy hibainformációs tömbje az adatbázis legutóbbi műveletéről. A tömb a következő mezőkből áll:

  • Az SQLSTATE hibakód.

  • A meghajtó-specifikus hibakód.

  • A driver-specifikus hibaüzenet.

Ha nincs hiba, vagy ha az SQLSTATE nincs beállítva, akkor az illesztőgép-specifikus mezők NULLAK.

Remarks

PDO::errorInfo csak olyan műveletekhez kér hibaadatokat, amelyeket közvetlenül az adatbázison végeznek. Használd a PDOStatement::errorInfo funkciót, amikor PDOStatement példányt PDO::p repare vagy PDO::query segítségével hoznak létre.

A PDO támogatását a Microsoft Drivers for PHP for SQL Server 2.0-s verziójában adták hozzá.

Example

Ebben a példában az oszlop neve rosszul van írva (Cityx helyett City), ami hibát okoz, amelyet aztán jelentenek.

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

További ODBC üzenetek

Ha kivétel történik, az ODBC illesztőprogram több hibát is visszaadhat a problémák diagnosztizálásához. Azonban a PDO::errorInfo mindig csak az első hibát mutatja. Erre a hibajelentésre válaszul a PDO::errorInfo és PDOStatement::errorInfo frissítették, hogy a drivereknek legalább a következő három mezőt kell megjeleníteniük:

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.

Az 5.9.0-tól kezdődően a PDO::errorInfo alapértelmezett viselkedése az, hogy további ODBC hibákat jelenít meg, ha elérhetőek. Például:

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

A fenti szkript futtatása kivételt kellett volna eredményeznie, és a kimenet így működik:

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

Ha a felhasználó az előző módot részesíti előnyben, egy új konfigurációs opcióval pdo_sqlsrv.report_additional_errors kikapcsolhatod azt. Egyszerűen, add hozzá a következő sort bármelyik php szkript elején:

ini_set('pdo_sqlsrv.report_additional_errors', 0);

Ebben az esetben a hibaadatok így jelennek meg, amikor ugyanazt a példa szkriptet futtatjuk:

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

Szükség esetén a felhasználó úgy dönthet, hogy hozzáadja a következő sort a php.ini fájlhoz, hogy kikapcsolja ezt a funkciót minden php szkriptjeiben:

pdo_sqlsrv.report_additional_errors = 0

Figyelmeztetések és hibák

Az 5.9.0-tól kezdve az ODBC figyelmeztetések már nem lesznek hibáként rögzítve. Vagyis a hibakódok "01" előtaggal figyelmeztetésként vannak rögzítve. Más szóval, ha a felhasználó csak hibákat szeretne naplózni, frissítse a php.ini így:

[pdo_sqlsrv]  
pdo_sqlsrv.log_severity = 1

Ebben az esetben a naplófájl nem tartalmaz figyelmeztető üzenetet(ek). Kérlek, nézd meg, hogyan működik a naplózás pdo_sqlsrv felhasználók számára.