Подтвердить что ты не робот

Как сжать сообщение об ошибке из PDO?

Я не могу получить сообщение об ошибке из PDO:

#$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
try {
  $sth = $dbh->prepare('@$%T$!!!');
  print_r($sth);
  print_r($dbh->errorInfo());
} catch (PDOException $e) {
    echo $e->getMessage();
}

Он выдает только:

PDOStatement Object
(
    [queryString] => @$%T$!!!
)
Array
(
    [0] => 00000
    [1] =>
    [2] =>
)

setAttribute ничего не помогает.

Это PHP 5.3.3 Apache 2.0 Handler
Драйвер PDO для MySQL включен
Версия клиентского API mysqlnd 5.0.7-dev - 091210 - $Просмотр: 300533 $

Что я могу сделать, чтобы получить информацию об ошибке?

4b9b3361

Ответ 1

setAttribute заставит PDO вызывать ошибки или исключения - последнее, когда вы выполняете запрос.

Для эмулированных подготовленных операторов проверка prepare() отсутствует:

Эмулированные подготовленные операторы не взаимодействуют с сервером базы данных, поэтому PDO:: prepare() не проверяет инструкцию.

Но будет запрос в execute(), когда запрос будет отправлен на сервер.

Однако драйвер mySQL поддерживает встроенные подготовленные операторы с mySQL 4.1 в любом случае, поэтому это не должно применяться. Использование

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

должно вызывать исключение для используемого вами запроса.

Ответ 2

Я тоже пытался получить информацию из errorInfo() на уровне дескриптора базы данных, но в итоге я получил информацию с уровня инструкции с помощью PDOStatement::errorInfo()

На веб-сайте PHP:

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

Ответ 3

Вам нужно сначала выполнить execute запрос, а затем проверить наличие ошибок: так оно делает следующее:

 $sth->execute();

а затем проверьте наличие ошибок. Тогда вы получите ошибки, если они есть.

Ответ 4

Здесь будет напечатан код ошибки, а также соответствующее подробное сообщение.

Совет: это просто демонстрация. Просто используйте для целей отладки. Не разрешать показывать сообщения об ошибках публике в версии выпуска.

try{
connection=$this->get_connection();//here i brought my connection string
connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
/**
Do your works here..
//$statement=$connection->prepare($sql);
//if you are using errorInfo use after prepare statement before execute.here in this method i am not using it.
//print_r($statement->errorInfo());
**/

$statement->execute();
}
catch(PDOException $e) {
              //this will echo error code with detail
              //example: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'nasme' in 'field list'
              echo $e->getMessage();
            }
//$statement=null;