PDO::errorInfo
Извлекает расширенные сведения об ошибке для последней операции с дескриптором базы данных.
Синтаксис
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.