Как сжать сообщение об ошибке из 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 $
Что я могу сделать, чтобы получить информацию об ошибке?
Ответы
Ответ 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;