Как просмотреть ошибку запроса в PDO PHP

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() } 

https://stackoverflow.com/a/32045823