Php 未引发PDO异常
我是PDO新手,关于PDO的一些事情让我感到困惑,我尝试创建一个测试函数,以查看是否会为无效查询引发异常,但不会引发任何异常 这是密码Php 未引发PDO异常,php,pdo,Php,Pdo,我是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.";db
<?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();
?>
没有例外,因为您没有生成一个。我想你们应该会看到警告,错误或者说变量并没有定义。检查您的错误报告设置
在test
中,使用$DBH
,但它不存在于本地堆栈中,而是作为对象成员。因此,您应该在构造函数方法中使用$this->DBH=new PDO(…)
为对象成员赋值,在test
方法中使用$this->DBH->setAttribute(…)
给你,修正版:
<?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();
除了缺少对数据库句柄的$this
的引用之外,还需要告诉PDO它不能模拟。下面的代码将引发如下异常:
SQLSTATE[42000]:语法错误或访问冲突:1064您有
SQL语法错误;检查与您的产品相对应的手册
MySQL服务器版本,用于使用near'DELECT id FROM的正确语法
1号线用户
@感觉应该是SELECT not DELECTASELECT id from users
不是无效的吗?@JvdBerg我不明白你的意思,查询DELECT id from users
是无效的MK_89这是他的观点,他试图测试抛出异常。我试了一下,什么都没有返回。这可能是因为你没有异常。尝试一些无意义的查询,比如$this->DBH->prepare('foo bar')这最终抛出了一个异常。当启用“模拟准备”时,有没有办法导致错误?
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();