Исключение PDO не бросается

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

вот код

<?php include_once("/var/www/include/constants.php"); class DB{ private $DBH; public function DB(){ try{ $DBH = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USER, DB_PASS); } catch(PDOException $e) { echo $e->getMessage(); } } public function test(){ try{ $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $DBH->prepare('DELECT id FROM users'); } catch(PDOException $e) { echo $e->getMessage(); } } }; /* Create database connection */ $db = new DB; $db->test(); ?> 

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

SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «DELECT id FROM users» в строке 1

 class DB{ private $DBH; public function DB(){ try{ $this->DBH = new PDO("mysql:host=localhost;dbname=movies", 'root', 'jsat12'); $this->DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false ); } catch(PDOException $e) { echo $e->getMessage(); } } public function test(){ try{ $this->DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $this->DBH->prepare('DELECT id FROM users'); } catch(PDOException $e) { echo $e->getMessage(); } } }; /* Create database connection */ $db = new DB; $db->test(); 

Нет никакого исключения, потому что вы его не выпускаете. Я думаю, вы должны увидеть предупреждение, ошибку или что-то сказать, что переменная не определена. Проверьте настройки отчетов об ошибках.

В test вы используете $DBH , но он не существует в локальном стеке, а как член объекта. Следовательно, вы должны использовать $this->DBH = new PDO(..) чтобы назначить значение объекту в методе конструктора, а $this->DBH->setAttribute(...) в методе test использовать его.

Вот вам, исправленная версия:

 <?php include_once("/var/www/include/constants.php"); class DB{ private $DBH; public function DB(){ try{ $this->DBH = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USER, DB_PASS); } catch(PDOException $e) { echo $e->getMessage(); } } public function test(){ try{ $this->DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $this->DBH->prepare('DELECT id FROM users'); } catch(PDOException $e) { echo $e->getMessage(); } } }; /* Create database connection */ $db = new DB; $db->test();