PDO::errorInfo

Descarregar o driver PHP

Recupera informação de erro estendida da operação mais recente no handle da base de dados.

Syntax

array PDO::errorInfo();  

Valor de retorno

Um conjunto de informações de erro sobre a operação mais recente no handle da base de dados. O array 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 erro, ou se o SQLSTATE não estiver definido, então os campos específicos do driver são NULL.

Observações

O PDO::errorInfo apenas recupera informações de erro para operações realizadas diretamente na base de dados. Use PDOStatement::errorInfo quando uma instância de PDOStatement for criada usando PDO::p repare ou PDO::query.

O suporte para PDO foi adicionado na versão 2.0 dos Microsoft Drivers for PHP para SQL Server.

Example

Neste exemplo, o nome da coluna está escrito incorretamente (Cityx em vez de City), causando um erro, que é depois reportado.

<?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 ODBC adicionais

Quando ocorre uma exceção, o Driver ODBC pode devolver mais do que um erro para ajudar a diagnosticar problemas. No entanto, o PDO::errorInfo mostra sempre apenas o primeiro erro. Em resposta a este relatório de bug, PDO::errorInfo e PDOStatement::errorInfo foram atualizados para indicar que os drivers devem mostrar pelo menos os seguintes três campos:

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 partir da 5.9.0, o comportamento padrão do PDO::errorInfo é mostrar erros ODBC adicionais, se 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 deveria ter lançado uma exceção, e o resultado é assim:

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 o utilizador preferir a forma anterior, pode ser usada uma nova opção pdo_sqlsrv.report_additional_errors de configuração para a desativar. Basta adicionar a seguinte linha no início de qualquer script php:

ini_set('pdo_sqlsrv.report_additional_errors', 0);

Neste caso, a informação de erro mostrada será assim, ao executar o mesmo script de exemplo:

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 necessário, o utilizador pode optar por adicionar a seguinte linha ao ficheiro php.ini para desligar esta funcionalidade em todos os seus scripts php:

pdo_sqlsrv.report_additional_errors = 0

Avisos e erros

A partir da 5.9.0, os avisos ODBC deixarão de ser registados como erros. Ou seja, os códigos de erro com o prefixo "01" são registados como avisos. Ou seja, se o utilizador quiser registar apenas erros, atualize a php.ini assim:

[pdo_sqlsrv]  
pdo_sqlsrv.log_severity = 1

Neste caso, o ficheiro de registo não conterá nenhuma mensagem de aviso. Por favor, verifique como funciona o registo para pdo_sqlsrv utilizadores.