Pdo execute получить ошибку

(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.

I have an insert statement that is executed with PDO. Insert works great however if there is an error I would like it displayed to the user.

I have the below try-catch block.

try{ 
    $insertuser = $db->prepare('INSERT INTO `she_she`.`Persons` (`idnumber`,`addedby`,`firstname`, `middlename`, `surname`, `fullname`, `gender`, `birthdate`, `homelanguage`, `department`, `employeetype`, `employeestatus`) VALUES  (?,?,?,?,?,?,?,?,?,?,?,?)'); 
    $insertuser->execute(array($idnumber,$user,$firstname, $middlename, $surname, $fullname, $gender, $birthdate, $language, $department, $employmenttype, $personstatus));  
} 
catch(PDOException $exception){ 
    return $exception; 
} 

If the query fails, or let’s say a duplicate IDNumber, I want this displayed to the user.

If I simply try to echo the variable $exception it does not work.

I want to return the MySQL error to the user.

Вернуться к: PDO

PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего
стиля разработки приложений.

  • PDO::ERRMODE_SILENT

    Это режим по умолчанию. PDO просто предоставит вам код ошибки, который
    можно получить методами PDO::errorCode() и
    PDO::errorInfo(). Эти методы реализованы как в объектах
    запросов так и в объектах баз данных. Если ошибка вызвана во время выполнения
    кода объекта запроса, нужно вызвать метод
    PDOStatement::errorCode() или
    PDOStatement::errorInfo() этого объекта. Если ошибка
    вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта.

  • PDO::ERRMODE_WARNING

    Помимо задания кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может
    быть полезно при отладке или тестировании, когда нужно видеть, что произошло,
    но не нужно прерывать работу приложения.

  • PDO::ERRMODE_EXCEPTION

    Помимо задания кода ошибки 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';

try {

$dbh = new PDO($dsn$user$password);
    
$dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
} catch (
PDOException $e) {
    echo 
'Подключение не удалось: ' $e->getMessage();
}
?>

Замечание:

Метод PDO::__construct() будет всегда бросать исключение PDOException,
если соединение оборвалось, независимо от установленного значения PDO::ATTR_ERRMODE.
Непойманные исключения фатальны.

Пример #2 Создание экземпляра класса PDO и задание режима обработки ошибок в конструкторе


<?php
$dsn 
'mysql:dbname=test;host=127.0.0.1';
$user 'googleguy';
$password 'googleguy';/*
    По прежнему оберните конструктор в блок try/catch, так как, даже при установке ERRMODE в WARNING,
    PDO::__construct всегда будет бросать исключение PDOException, если соединение оборвалось.
*/
try {
    
$dbh = new PDO($dsn$user$password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (
PDOException $e) {
    echo 
'Соединение оборвалось: ' $e->getMessage();
    exit;
}
// Следующий запрос приводит к ошибке уровня 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 18

Вернуться к: PDO

Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]:
Invalid parameter number: parameter was not defined’ in (строка 118) Stack trace: #0
PDOStatement->execute() #1 {main} thrown in

Строка 118 это $b->execute(); В целом понятно что он говорит что неверное количество параметров и какой-то не определён, но как-то можно заставить его показать какой именно?
Пробовал ставить:

echo $pdo->errorCode();
print_r($pdo->errorInfo());

Но он мне что-то ничего вообще не показывает.


  • Вопрос задан

    более трёх лет назад

  • 1739 просмотров

Перехватывайте исключение PDOException, в нем «зашита» более подробная инфа по ошибке. Плюс, в блоке catch вы можете обработать объект запроса PDOStatement, из которого можно вытянуть данные методом debugDumpParams(). Например:

try {
  $stmt->execute($sq);
} catch (PDOException $e) {
  print_r($e->getMessage());
  $stmt->debugDumpParams();
}

php.net/manual/ru/class.pdostatement.php
php.net/manual/ru/class.pdoexception.php

Никак. Что разработчики посчитали нужным засунуть в исключение, то и имеем. Если уж сильно хочется, пишите свою обертку над PDO, и сами формируйте сообщение об ошибке. Ну совсем серьёзный вариант: написать pull request.

А вообще исключения не для отладки придумали.

Пригласить эксперта


  • Показать ещё
    Загружается…

22 июн. 2023, в 00:59

8000 руб./за проект

22 июн. 2023, в 00:56

8000 руб./за проект

22 июн. 2023, в 00:39

12000 руб./за проект

Минуточку внимания

  • Pci контроллер simple communications драйвер ошибка
  • Pci controller simple communications ошибка
  • Pc004 ниссан примера р12 ошибка
  • Pc remote ошибка проекции начального экрана
  • Pc health check windows 11 ошибка 2503