致命错误:在第33行调用null上的成员函数prepare()

时间:2015-06-27 02:05:50

标签: php debugging pdo

以下是我工作的代码示例 我在第33行遇到致命错误,请帮助我,如果你能非常感谢你的话     

     private $dbh;
     private $error;
     private $stmt;

    public function __construct() {
         //  set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
         // set options
         $options = array (
              PDO::ATTR_PERSISTENT => true,
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
         );
         //  create a new PDO instance
        try {
        $this->dbh = new PDO ($dsn, $this->user, $this->pass, $options);
        }
        //  catch any errors

         catch(PDOException $e){
            $this->error = $e->getMessage();
         }
    }

    public function query($query) {
       $this-> stmt = $this-> dbh->prepare($query); 
    }

2 个答案:

答案 0 :(得分:1)

您使用异常错误方式。

只需像这样编写代码

public function __construct() {
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    $options = array (
          PDO::ATTR_PERSISTENT => true,
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );
    $this->dbh = new PDO ($dsn, $this->user, $this->pass, $options);
}

public static function __call($method, $args)
{
    return call_user_func_array(array($this->dbh, $method), $args);
}

public static function run($sql, $args = [])
{
    $stmt = $this->dbh->prepare($sql);
    $stmt->execute($args);
    return $stmt;
}

这是您的包装器可能需要的所有代码。所有其他代码都是错误的和多余的。

答案 1 :(得分:0)

似乎即使你正在捕获错误,你仍然要继续运行查询函数,因此,如果构造失败了,那么$ dbh就不会被初始化。