2010-09-16 3 views
55

я не могу показаться, чтобы получить какое-либо сообщение об ошибке от ПДО:Как сжать сообщение об ошибке из 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 включен
Client версии API mysqlnd 5.0.7-DEV - 091210 - $ Revision: 300533 $

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

+0

Что выводит 'print_r ($ sth-> errorInfo())'? – shamittomar

+0

@shamittomar Я тоже пробовал, он выдавал массив из трех пустых элементов –

ответ

2

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

$sth->execute(); 

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

+4

И как вы «проверяете на наличие ошибок»? –

+0

который, в конце концов, вопрос в чем вопрос. Почему это было опубликовано как ответ, а не комментарий? И почему у него появилось так много ударов? – Mawg

64

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

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

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

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

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

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

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

+0

пример справочной страницы также не выполняется: http://ru2.php.net/manual/en/pdo.errorinfo.php и с выполнением все еще не повезло –

+2

@Col что делать, если вы задали '$ dbh-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION); '? –

+0

@Col Если вы установили 'ERRMODE_EXCEPTION' и нет исключений ни из' prepare() ', ни' exec() 'то что-то еще не так - в этом случае я понятия не имею, что –

4

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

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

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

2

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

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

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; 
+1

http://phpdelusions.net/try-catch –

+0

Я не понимаю, почему мой ответ был отредактирован так сильно, что минус проголосовало (-), поскольку мы знаем, что это демонстрация того, как что-то делать. его единственный способ выполнить это при отладке кода. он показывает подробное сообщение об ошибке с кодом ошибки. Теперь я не думаю, что этот ответ есть:/почему бы не удалить его. – aimme

+0

Ах, вы восстановили исходный код - достаточно справедливо. Если он будет изменен таким образом, который снова изменит ваше намерение, поднимите флаг модератора, а не войдите в войну редактирования - спасибо. Я исправлю все шапки - у нас есть правило «без крика» здесь: :-) ' – halfer