Php 未引发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

我是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();

?>


没有例外,因为您没有生成一个。我想你们应该会看到警告,错误或者说变量并没有定义。检查您的错误报告设置

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 DELECTA
SELECT 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();