3

我在此处找到的 PHP PDO Wrapper 类上使用了一些细微的变化:http ://www.imavex.com/php-pdo-wrapper-class/

这是我正在使用的新构造函数:

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();
    }
}

error是这个类的一个私有变量,定义在类的开头,在constructor.strong文本之上

当我像这样使用它时

$database = new Database(
        'mysql:host=' . $config['mysql_host'] . ';port=' . $config['mysql_port'] . ';dbname=' . $config['mysql_database'],
        $config['mysql_username'],
        $config['mysql_password']
);

它向我显示了这个错误:从空值创建默认对象,指向数据库类文件,在行$this->error = $e->getMessage();

抛出异常的原因是因为我还没有设置mysql用户名和密码,所以不用担心。我试图弄清楚它为什么会出现这个错误以及如何解决它。

4

1 回答 1

2

似乎由于 db 类扩展了 PDO,当 PDO 构造函数抛出异常时 $this 变为 NULL。

class db extends PDO {
    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) {
            echo "Got PDOException\n";
            var_dump($this);
        }
    }
}


new db('mysql:host=localhost;port=3306;dbname=something', 'invaliduser', 'invalidpass');

如果您运行该代码,您将获得以下输出:

Got PDOException
NULL

为了解决这个问题,您可以删除有问题的行并检查 db 对象是否为 null 或删除 try-catch 并在实例化新数据库时进行异常处理。或者,您可以重写该类以将 PDO 对象存储在变量中,而不是扩展 PDO。

于 2012-12-18T07:23:21.070 回答