Как выжать сообщение об ошибке из PDO? - PullRequest
57 голосов
/ 16 сентября 2010

Не получается получить сообщение об ошибке от 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 $

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

Ответы [ 4 ]

64 голосов
/ 16 сентября 2010

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

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

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

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

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

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

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

4 голосов
/ 25 августа 2012

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

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

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

3 голосов
/ 18 августа 2015

Будет напечатан код ошибки и соответствующее подробное сообщение.

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

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;
2 голосов
/ 16 сентября 2010

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

 $sth->execute();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...