8

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

?>
4

2 回答 2

6

除了缺少对$this数据库句柄的引用之外,您还需要告诉 PDO 它不能模拟准备工作。下面的代码抛出这样的异常:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DELECT id FROM users”附近使用正确的语法

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();
于 2012-10-13T11:33:15.350 回答
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();
于 2012-10-13T11:25:24.207 回答