PDO::errorCode
Recupera informazioni dettagliate sugli errori dell'ultima operazione dell'handle di database.
Sintassi
array PDO::errorInfo();
Valore restituito
Una matrice di informazioni sugli errori dell'ultima operazione dell'handle di database. La matrice include i campi seguenti:
Codice di errore SQLSTATE.
Codice di errore specifico del driver.
Messaggio di errore specifico del driver.
Se non si verificano errori o se il valore di SQLSTATE non è impostato, i campi specifici del driver sono NULL.
Osservazioni:
PDO::errorInfo recupera solo le informazioni sugli errori per le operazioni eseguite direttamente sul database. Usare PDOStatement::errorInfo quando viene creata un'istanza di PDOStatement mediante PDO::prepare o PDO::query.
Il supporto per PDO è stato aggiunto nella versione 2.0 dei driver Microsoft per PHP per SQL Server.
Esempio
In questo esempio il nome della colonna errato (Cityx
anziché City
) causa un errore, che viene quindi segnalato.
<?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());
?>
Messaggi ODBC aggiuntivi
Quando si verifica un'eccezione, il driver ODBC può restituire più di un errore per diagnosticare i problemi. Tuttavia, PDO::errorInfo visualizza sempre solo il primo errore. In risposta a questo report sui bug, PDO::errorInfo e PDOStatement::errorInfo sono stati aggiornati per indicare che i driver devono visualizzare almeno i tre campi seguenti:
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.
A partire dalla versione 5.9.0, il comportamento predefinito di PDO::errorInfo consiste nel mostrare errori ODBC aggiuntivi, se disponibili. Ad esempio:
<?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);
}
?>
L'esecuzione dello script precedente deve avere generato un'eccezione e l'output è simile al seguente:
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."
}
Se l'utente preferisce il modo precedente, è possibile usare una nuova opzione di configurazione pdo_sqlsrv.report_additional_errors
per disattivarla. È sufficiente aggiungere la riga seguente all'inizio di qualsiasi script php:
ini_set('pdo_sqlsrv.report_additional_errors', 0);
In questo caso, quando si esegue lo stesso script di esempio, le informazioni sull'errore visualizzate saranno simili a queste:
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'."
}
Se necessario, l'utente può scegliere di aggiungere la riga seguente al file php.ini per disattivare questa funzionalità in tutti gli script php:
pdo_sqlsrv.report_additional_errors = 0
Avvisi ed errori
A partire dalla versione 5.9.0, gli avvisi ODBC non verranno più registrati come errori. Ciò significa che i codici di errore con prefisso "01" vengono registrati come avvisi. In altre parole, se l'utente vuole registrare solo gli errori, aggiornare il php.ini come segue:
[pdo_sqlsrv]
pdo_sqlsrv.log_severity = 1
In questo caso, il file di log non conterrà alcun messaggio di avviso. Controllare il funzionamento della registrazione per gli utenti pdo_sqlsrv.