(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::errorInfo —
Получает расширенную информацию об ошибке, произошедшей в ходе
последнего обращения к базе данных
Описание
public PDO::errorInfo(): array
Список параметров
У этой функции нет параметров.
Возвращаемые значения
PDO::errorInfo() возвращает массив с информацией об ошибке,
произошедшей в ходе выполнения последней операции с базой данных. Массив
содержит как минимум следующие поля:
| Элемент | Информация |
|---|---|
| 0 | Код ошибки SQLSTATE (пятисимвольный идентификатор, определённый в стандарте ANSI SQL). |
| 1 | Код ошибки, заданный драйвером. |
| 2 | Сообщение об ошибке, заданное драйвером |
Замечание:
Если не задан SQLSTATE код или драйвер не сообщил об ошибке, то элементы
следующие за нулевым будут иметь значениеnull.
PDO::errorInfo() выдаёт информацию об ошибке только для операций,
совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement
методами PDO::prepare() или
PDO::query(), и вызвать ошибку его методами,
PDO::errorInfo() эту ошибку не отобразит. Вам нужно вызвать
PDOStatement::errorInfo(), чтобы получить информации об ошибках для операции,
выполняемой на определённом объекте PDOStatement.
Примеры
Пример #1
Вывод полей массива errorInfo() для PDO_ODBC подключения к базе данных DB2
<?php
/* Спровоцируем синтаксическую ошибку SQL */
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
?>
Результат выполнения данного примера:
PDO::errorInfo():
Array
(
[0] => HY000
[1] => 1
[2] => near "bogus": syntax error
)
Смотрите также
- PDO::errorCode() — Возвращает код SQLSTATE результата последней операции с базой данных
- PDOStatement::errorCode() — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
- PDOStatement::errorInfo() — Получение расширенной информации об ошибке, произошедшей в результате работы
объекта PDOStatement
alagar86 at gmail dot com ¶
12 years ago
Please note : that this example won't work if PDO::ATTR_EMULATE_PREPARES is true.
You should set it to false
<?php
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
?>
quickshiftin at gmail dot com ¶
16 years ago
here are the error codes for sqlite, straight from their site:
The error codes for SQLite version 3 are unchanged from version 2. They are as follows:
#define SQLITE_OK 0 /* Successful result */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* (Internal Only) Table or record not found */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_ROW 100 /* sqlite_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite_step() has finished executing */
mazen at mindcraftinc dot com ¶
14 years ago
Some PDO drivers return a larger array. For example, the SQL Server driver returns 5 values.
For example:
<?php
$numRows = $db->exec("DELETE FROM [TableName] WHERE ID between 6 and 17");
print_r($db->errorInfo());
?>
Result:
Array
(
[0] => 00000
[1] => 0
[2] => (null) [0] (severity 0) []
[3] => 0
[4] => 0
)
Ошибки и их обработка
PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего
стиля разработки приложений.
-
PDO::ERRMODE_SILENTДо PHP 8.0.0, это был режим по умолчанию. PDO просто предоставит вам код ошибки, который
можно получить методами PDO::errorCode() и
PDO::errorInfo(). Эти методы реализованы как в объектах
запросов, так и в объектах баз данных. Если ошибка вызвана во время выполнения
кода объекта запроса, нужно вызвать метод
PDOStatement::errorCode() или
PDOStatement::errorInfo() этого объекта. Если ошибка
вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта. -
PDO::ERRMODE_WARNINGПомимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может
быть полезно при отладке или тестировании, когда нужно видеть, что произошло,
но не нужно прерывать работу приложения. -
PDO::ERRMODE_EXCEPTIONНачиная с PHP 8.0.0 является режимом по умолчанию. Помимо задания кода ошибки PDO будет выбрасывать исключение
PDOException, свойства которого будут отражать
код ошибки и её описание. Этот режим также полезен при отладке, так как
сразу известно, где в программе произошла ошибка. Это позволяет быстро
локализовать и решить проблему. (Не забывайте, что если исключение
является причиной завершения работы скрипта, все активные транзакции
будут откачены.)Режим исключений также полезен, так как даёт возможность структурировать
обработку ошибок более тщательно, нежели с обычными предупреждениями PHP, а
также с меньшей вложенностью кода, чем в случае работы в тихом режиме с
явной проверкой возвращаемых значений при каждом обращении к базе данных.Подробнее об исключениях в PHP смотрите в разделе Исключения.
PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE.
Отдельные драйверы PDO могут задавать соответствия своих собственных кодов
кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный
код SQLSTATE. Если необходима специфичная информация об ошибке, PDO предлагает
метод PDO::errorInfo(), который возвращает массив, содержащий
код SQLSTATE, код ошибки драйвера, а также строку ошибки драйвера.
Пример #1 Создание PDO объекта и установка режима обработки ошибок
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// PDO выбросит исключение PDOException (если таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Результат выполнения данного примера:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10
Stack trace:
#0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...')
#1 {main}
thrown in /tmp/pdo_test.php on line 10
Замечание:
Метод PDO::__construct() будет всегда бросать исключение PDOException,
если соединение оборвалось, независимо от установленного значенияPDO::ATTR_ERRMODE.
Пример #2 Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Результат выполнения данного примера:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 9
There are no user contributed notes for this page.
Вернуться к: PDO
PDO::errorInfo
(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
PDO::errorInfo —
Получает расширенную информацию об ошибке, произошедшей в ходе
последнего обращения к базе данных
Описание
public array PDO::errorInfo
( void
)
Возвращаемые значения
PDO::errorInfo() возвращает массив с информацией об ошибке
произошедшей в ходе выполнения последней операции с базой данных. Массив
содержит следующие поля:
| Элемент | Информация |
|---|---|
| 0 | Код ошибки SQLSTATE (пятисимвольный идентификатор определенный в стандарте ANSI SQL). |
| 1 | Код ошибки, заданный драйвером. |
| 2 | Выданное драйвером сообщение об ошибке. |
Замечание:
Если не задан SQLSTATE код или драйвер не сообщил об ошибке, то элементы
следующие за нулевым будут иметь значениеNULL.
PDO::errorInfo() выдает информацию об ошибке только для операций
совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement
методами PDO::prepare() или
PDO::query(), и вызвать ошибку его методами,
PDO::errorInfo() эту ошибку не отобразит. В таких случаях
нужно пользоваться собственными методами получения информации об ошибках объекта
PDOStatement PDOStatement::errorInfo().
Примеры
Пример #1
Вывод полей массива errorInfo() для PDO_ODBC подключения к базе данных DB2
<?php
/* Спровоцируем синтаксическую ошибку SQL */
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
?>
Результат выполнения данного примера:
PDO::errorInfo():
Array
(
[0] => HY000
[1] => 1
[2] => near "bogus": syntax error
)
Смотрите также
- PDO::errorCode() — Возвращает код SQLSTATE результата последней операции с базой данных
- PDOStatement::errorCode() — Определяет SQLSTATE код соответствующий последней операции объекта PDOStatement
- PDOStatement::errorInfo() — Получение расширенной информации об ошибке, произошедшей в результате работы
объекта PDOStatement
Вернуться к: PDO
$st = $db->prepare("SELECT * FROM c6ode");
How can I check the intentional mysql error for the query in above case?
asked Jan 8, 2012 at 8:41
0
You need to set the error mode attribute PDO::ATTR_ERRMODE to PDO::ERRMODE_EXCEPTION.
And since you expect the exception to be thrown by the prepare() method, you should disable the PDO::ATTR_EMULATE_PREPARES feature. Otherwise the MySQL server doesn’t «see» the statement until it’s executed.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
prints (or logs, depends on the PHP settings)
SQLSTATE[42S02]: Base table or view not found:
1146 Table 'test.doesnotexist' doesn't exist
answered Jan 8, 2012 at 8:52
VolkerKVolkerK
95.5k20 gold badges164 silver badges227 bronze badges
1
I’m using this without any additional settings:
if (!$st->execute()) {
print_r($st->errorInfo());
}
The Codesee
3,7145 gold badges38 silver badges78 bronze badges
answered Jan 8, 2012 at 8:48
ladarladar
5,8583 gold badges26 silver badges38 bronze badges
0
I’m guessing that your complaint is that the exception is not firing. PDO is most likely configured to not throw exceptions. Enable them with this:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
answered Jan 8, 2012 at 8:45
Steve RukutsSteve Rukuts
9,1773 gold badges50 silver badges72 bronze badges
2
a quick way to see your errors whilst testing:
$error= $st->errorInfo();
echo $error[2];
answered Jan 15, 2014 at 11:19
LanLan
1,8742 gold badges20 silver badges37 bronze badges
0
/* Provoke an error — the BONES table does not exist */
$sth = $dbh->prepare('SELECT skull FROM bones');
$sth->execute();
echo "\nPDOStatement::errorInfo():\n";
$arr = $sth->errorInfo();
print_r($arr);
output
Array
(
[0] => 42S02
[1] => -204
[2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704
)
answered Jul 5, 2017 at 9:07
1
I’m just converting a site to PDO and this is my first exposure to it, but I’m having difficulty obtaining any kind of useful error information from PDO. I’ve read numerous other posts on this subject but none of them seem to provide a solution which works for me.
Here is the code:
try {
$dbh = new PDO("mysql:host=".CO_DB_HOST.";dbname=".CO_DB_NAME, CO_DB_UNAME, CO_DB_PWORD);
$dbh ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch(PDOException $e) {
echo $e->getMessage();
}
function addRec($data) {
global $part_id, $dbh;
$part_id++;
try {
$sth=$dbh->prepare("
INSERT INTO
non_existent_table
(
name
) VALUES (
?
);
");
for ($i = 0; $i < count($data); $i++) {
$sth->execute($data[$i]);
}
}
catch(PDOException $e) {
echo "Something went wrong. Please report this error.";
file_put_contents('/PDOErrors.txt', PDOStatement::errorInfo(), FILE_APPEND);
}
}
// Insert a database record
$data = array(
array(
'joe blogs', /* name */
)
);
addRec($data);
The table does not exist but I’m getting no error in PDOError.txt and nothing in my httpd error log. Can someone shed some light on what I’m doing wrong please? Thanks.
asked Dec 3, 2012 at 5:05
1
errorInfo() is not a static method. Also, it returns an array, not a string.
You should be fine with the information in the exception. Use something like this instead
file_put_contents('/PDOErrors.txt', $e->getMessage(), FILE_APPEND);
For extra information, you could also append the stacktrace.
Edit
Are you sure /PDOErrors.txt is the correct file path for your error log? That’s in the filesystem root which I doubt is what you want or even possible.
answered Dec 3, 2012 at 5:11
PhilPhil
158k23 gold badges242 silver badges245 bronze badges
3
