Я новичок в 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();