PHP mysql PDO扩展类错误

时间:2015-10-06 15:40:27

标签: php mysql oop pdo

我是OOP的新手,我将使用简单的php,mysql包装类。我无法调用公共函数,它给我一个错误。我无法弄明白!!

<?php 
class db extends PDO {

    private $error;
    private $sql;
    private $bind;
    private $errorCallbackFunction;
    private $errorMsgFormat;

    public function __construct($dsn, $user="", $passwd="") {

        $options = array(
             PDO::ATTR_PERSISTENT => true, 
             PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
             parent::__construct($dsn, $user, $passwd, $options);
        } 
        catch (PDOException $e) {
             $this->error = $e->getMessage();
        }
    }

    public function test() {
         echo 'whats wrong with this!!!';
    }

}   

$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", "");
$d->test(); ?>

我的xampp服务器的结果是

  

警告:在第18行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中从空值创建默认对象

     

致命错误:在第32行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中调用null上的成员函数test()

请告诉我如何拨打公共功能测试?

4 个答案:

答案 0 :(得分:2)

这里有什么问题的解释是有点啰嗦,所以请耐心等待。

在子类(db)的构造函数中,显式调用父类(PDO)的构造函数:

try {
    parent::__construct($dsn, $user, $passwd, $options);

但是这个调用正在抛出异常,你会抓住它:

} catch (PDOException $e) {

然后你尝试设置对象的属性:

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

$this尚未实例化(因为父构造函数失败!) - 因此它不再是对当前对象的特殊引用,而是PHP将其视为任何其他变量(并尝试分配)到error属性会导致PHP将\stdClass的默认对象实例化为$this而不是;因此相当神秘的警告:

  

警告:在第18行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中从空值创建默认对象

坦率地说,这种行为是疯狂的,PHP真的应该做一些更加理智的事情,就像那时的纾困一样,但不过它会继续......

$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", "");

...但是由于尝试实例化db对象失败,$d为空。然后,调用$d->test()的尝试显然会因您看到的错误而失败:

  

致命错误:在第32行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中调用null上的成员函数test()

那么,你应该怎么做才能解决它?好吧,你可以调查PDO构造函数的调用失败的原因(可能是错误的数据库连接细节)并纠正错误;您甚至可以更好地处理异常,以便更清楚地传达此类错误;您甚至可以在尝试实例化后检查$d的值,以验证它是否成功...

但为什么要将PDO分类?您可以(也可能应该)直接使用它:

$d = new PDO("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", "");

答案 1 :(得分:1)

如果您是OOP的新手,为什么在没有足够使用其他课程经验的情况下创建自己的课程?它对你毫无益处。 几乎每堂课都错了。

相反,学习使用原始PDO。它已经是一个班级,请注意,而不是坏的。它可以比你自制的包装更好。首先学习PDO。

答案 2 :(得分:0)

您的示例代码似乎与您的实际代码不同,但您的测试方法似乎没问题。

Warning: Creating default object from empty value in C:\xampp\htdocs\newwedding\models\class.db.php on line 18

默认对象是没有构造函数的对象,确保您将参数传递给构造函数,它们应该是它们应该是什么(例如,不是空的!)

Fatal error: Call to a member function test() on null in C:\xampp\htdocs\newwedding\models\class.db.php on line 32

您的db对象为null,而不是您认为的那样。你不能在空对象上调用方法!

答案 3 :(得分:-3)

替换此行:

parent::__construct($dsn, $user, $passwd, $options);

有了这个:

new PDO($dsn, $user, $passwd, $options);