PDO::errorInfo
Recupera informações de erro estendidas da operação mais recente no identificador do banco de dados.
Sintaxe
array PDO::errorInfo();
Valor retornado
Uma matriz de informações de erro sobre a operação mais recente no identificador do banco de dados. A matriz consiste nos seguintes campos:
O código de erro SQLSTATE.
O código de erro específico do driver.
A mensagem de erro específica do driver.
Se não houver nenhum erro ou se o SQLSTATE não estiver definido, os campos específicos do driver serão NULL.
Comentários
PDO::errorInfo recupera somente informações de erro de operações realizadas diretamente no banco de dados. Use PDOStatement::errorInfo quando uma instância de PDOStatement for criada usando PDO::prepare ou PDO::query.
O suporte para PDO foi adicionado na versão 2.0 dos Drivers da Microsoft para PHP para SQL Server.
Exemplo
Neste exemplo, o nome da coluna está incorreto, Cityx
em vez de City
, causando um erro, que é, então, relatado.
<?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());
?>
Mensagens adicionais de ODBC
Quando uma exceção ocorrer, o Driver ODBC poderá retornar mais de um erro para ajudar a diagnosticar problemas. No entanto, a função PDO::errorInfo sempre mostrará apenas o primeiro erro. Em resposta a esse relatório de bugs, as funções PDO::errorInfo e PDOStatement::errorInfo foram atualizadas para indicar que os drivers deverão exibir pelo menos os três campos abaixo:
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.
Da versão 5.9.0 em diante, o comportamento padrão de PDO::errorInfo será mostrar erros adicionais de ODBC, se eles estiverem disponíveis. Por exemplo:
<?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);
}
?>
Executar o script acima deve ter gerado uma exceção, bem como uma saída semelhante a esta:
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."
}
Caso o usuário prefira usar o modo anterior, uma nova opção de configuração pdo_sqlsrv.report_additional_errors
poderá ser usada para desligá-la. Basta adicionar a seguinte linha no início de um script php:
ini_set('pdo_sqlsrv.report_additional_errors', 0);
Nesse caso, ao executar o mesmo script de exemplo, as informações de erro mostradas serão semelhantes a esta:
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'."
}
Caso seja necessário, o usuário poderá escolher adicionar a linha abaixo ao arquivo php.ini para desligar esse recurso em todos os scripts php:
pdo_sqlsrv.report_additional_errors = 0
Avisos e erros
Da versão 5.9.0 em diante, os avisos de ODBC não serão mais registrados em log como erros. Isso significa que códigos de erro com o prefixo "01" serão registrados em log como avisos. Em outras palavras, caso o usuário queira registrar somente erros, atualize o php.ini da seguinte maneira:
[pdo_sqlsrv]
pdo_sqlsrv.log_severity = 1
Nesse caso, o arquivo de log não conterá mensagens de aviso. Verifique de que modo funciona a opção registrar em log para usuários do pdo_sqlsrv.