try { $db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW); $st = $db->prepare("SELECT * FROM c6ode"); } catch (PDOException $e){ echo $e->getMessage(); }
Как я могу проверить ошибку mysql для запроса в приведенном выше случае?
Вам необходимо установить атрибут режима ошибки 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 = true, по-видимому, является значением по умолчанию для драйвера 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 ));
Я использую это без каких-либо дополнительных настроек:
if (!$st->execute()) { print_r($st->errorInfo()); }
Я предполагаю, что ваша жалоба заключается в том, что исключение не стреляет. PDO, скорее всего, сконфигурирован так, чтобы не генерировать исключения. Включите их следующим образом:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
быстрый способ увидеть ваши ошибки во время тестирования:
$error= $st->errorInfo(); echo $error[2];
/ * Произошла ошибка – таблица BONES не существует * /
$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 )
эта работа для меня, если вы получите эту ошибку:
Неустранимая ошибка: вызов неопределенного метода mysqli :: error ()
if(! empty( $db->error ) ){ echo $db->error; // <- this is not a function call error() }