2012-01-08 5 views

ответ

11

Я предполагаю, что ваша жалоба заключается в том, что исключение не стреляет. PDO, скорее всего, сконфигурирован так, чтобы не генерировать исключения. Включить их с этим:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+0

Nope все еще не работает, я знаю, что мой запрос неверен, но я хочу отобразить эту ошибку. – TPSstar

+0

Вы можете обнаружить, что есть ошибка при вызове 'new PDO (...' self. Попробуйте увеличить уровень error_reporting, установив, например, 'error_reporting (E_ALL)'. –

22

Я использую это без каких-либо дополнительных настроек:

if (!$st->execute()) { 
    print_r($st->errorInfo()); 
} 
42

Вы должны установить режим ошибки атрибута PDO :: ATTR_ERRMODE к PDO :: ERRMODE_EXCEPTION.
И поскольку вы ожидаете, что исключение будет выбрано методом prepare(), вы должны отключить функцию PDO :: ATTR_EMULATE_PREPARES * . В противном случае сервер MySQL не «видит» заявление до его выполнения.

<?php 
try { 
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 


    $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)'); 
} 
catch(Exception $e) { 
    echo 'Exception -> '; 
    var_dump($e->getMessage()); 
} 

печатает (в моем случае)

Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 
1146 Table 'test.doesnotexist' doesn't exist" 

см http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
EMULATE_PREPARES = правда, кажется, по умолчанию для водителя Pdo_Mysql прямо сейчас. Кэш-память запроса была исправлена ​​/ изменена с тех пор и с драйвером mysqlnd у меня не было проблем с EMULATE_PREPARES = false (хотя я всего лишь любитель php, не верю мне на слово ...)

*), а затем есть PDO::MYSQL_ATTR_DIRECT_QUERY - я должен признать, что я не понимаю, взаимодействие этих двух атрибутов (пока), поэтому я их обоих, как

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false, 
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false, 
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION 
)); 
6

быстрый способ, чтобы увидеть свои ошибки? при испытаниях:

+0

Я думаю, что это очень просто. – NaveenDA

-1

эта работа для меня, если вы получить эту ошибку:

Фатальная ошибка: Вызов неопределенной метод MySQLi :: Ошибка()

if(! empty($db->error)){ 
    echo $db->error; // <- this is not a function call error() 
} 

https://stackoverflow.com/a/32045823

+0

Почему downvote, есть ли какие-либо проблемы с моим кодом? –

1

/* Спровоцировать ошибка - таблица КОСТИ не существует */

$sth = $dbh->prepare('SELECT skull FROM bones'); 
$sth->execute(); 

echo "\nPDOStatement::errorInfo():\n"; 
$arr = $sth->errorInfo(); 
print_r($arr); 

выход

Array 
(
    [0] => 42S02 
    [1] => -204 
    [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704 
) 
Смежные вопросы