【问题标题】:PDO exception is not being thrownPDO 异常没有被抛出
【发布时间】:2012-10-13 11:19:33
【问题描述】:

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

?>

【问题讨论】:

  • @feeela 它应该是 SELECT 而不是 DELECT
  • A select id from users 无效?
  • @JvdBerg 我不明白你的意思,查询DELECT id FROM users无效
  • mk_89 这就是他的意思,他正在尝试测试抛出异常。

标签: php pdo


【解决方案1】:

除了缺少对数据库句柄 $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();

【讨论】:

  • 这终于抛出了异常
  • 启用模拟准备时有什么方法会导致错误?
【解决方案2】:

也不例外,因为您没有生产。我猜你应该看到警告、错误或未定义变量。检查您的错误报告设置。

test 中,您使用$DBH,但它并不存在于本地堆栈中,而是作为对象成员存在。因此,您应该在构造方法中使用$this-&gt;DBH = new PDO(..) 为对象成员赋值,并在test 方法中使用$this-&gt;DBH-&gt;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->DBH->prepare('foo bar')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多