我在这里找到的PHP PDO Wrapper Class略有不同: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用户名和密码,所以不用担心。我试图找出它为什么会出现这个错误以及如何修复它。
答案 0 :(得分:2)
似乎由于db类扩展了PDO,当PDO构造函数抛出异常$时,它变为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。