Поделиться через


PDO::errorInfo

Скачать драйвер PHP

Извлекает расширенные сведения об ошибке для последней операции с дескриптором базы данных.

Синтаксис

array PDO::errorInfo();  

Возвращаемое значение

Массив сведений об ошибке для последней операции с дескриптором базы данных. Этот массив состоит из следующих полей:

  • Код ошибки SQLSTATE.

  • Код ошибки, относящийся к драйверу.

  • Сообщение об ошибке, относящееся к драйверу.

Если ошибка отсутствует или не задано SQLSTATE, то поля, относящиеся к драйверу, будут иметь значение NULL.

Замечания

PDO::errorInfo возвращает только сведения об ошибках для операций, выполненных непосредственно в базе данных. Используйте PDOStatement::errorInfo при создании экземпляра PDOStatement с помощью PDO::prepare или PDO::query.

Добавлена поддержка PDO версии 2.0 драйверов Майкрософт для PHP для SQL Server.

Пример

В этом примере неправильно указано имя столбца (Cityx вместо City), что вызывает ошибку, о которой затем сообщается.

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

Дополнительные сообщения ODBC

При возникновении исключения драйвер ODBC может вернуть несколько ошибок, которые помогают в диагностике проблем. Однако PDO::errorInfo всегда выдает только первую ошибку. В ответ на этот отчет об ошибке функции PDO::errorInfo и PDOStatement::errorInfo были обновлены: теперь драйверы должны выводить по крайней мере следующие три поля:

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.

Начиная с версии 5.9.0 функция PDO::errorInfo по умолчанию выводит дополнительные ошибки ODBC при их наличии. Например:

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

При выполнении приведенного выше скрипта должно было произойти исключение, и выходные данные должны выглядеть так:

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

Если пользователь предпочитает прежнее поведение, отключить новое можно с помощью параметра конфигурации pdo_sqlsrv.report_additional_errors. Просто добавьте следующую строку в начало любого скрипта PHP:

ini_set('pdo_sqlsrv.report_additional_errors', 0);

В этом случае при выполнении того же примера скрипта будут показаны следующие сведения об ошибках:

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

При необходимости пользователь может добавить следующую строку в файл php.ini, чтобы отключить эту функцию во всех скриптах PHP:

pdo_sqlsrv.report_additional_errors = 0

Предупреждения и ошибки

Начиная с версии 5.9.0 предупреждения ODBC больше не будут регистрироваться как ошибки. То есть коды ошибок с префиксом 01 регистрируются как предупреждения. Иными словами, если вы хотите регистрировать только ошибки, измените файл php.ini следующим образом:

[pdo_sqlsrv]  
pdo_sqlsrv.log_severity = 1

В этом случае в файле журнала не будет сообщений с предупреждениями. Ознакомьтесь с тем, как ведется журнал для пользователей pdo_sqlsrv.

См. также

Класс PDO

PDO

PDOStatement::errorInfo