我是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();
?>
答案 0 :(得分:5)
除了缺少对数据库句柄的$this
的引用之外,还需要告诉PDO它必须不能模拟准备。 下面的代码将抛出这样的异常:
SQLSTATE [42000]:语法错误或访问冲突:1064您有 SQL语法错误;查看与您的手册相对应的手册 MySQL服务器版本,用于在'DELECT id FROM附近使用正确的语法 用户在第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();
答案 1 :(得分:0)
没有例外,因为你没有生产一个。我猜你应该看到警告,错误或者说没有定义变量的东西。检查错误报告设置。
在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();