如果查询出错,我对PDO和PDOStatement类进行了简单的扩展,以便进行错误记录。这是我简化的代码:
class MyPDO extends PDO
{
public function __construct($db)
{
try
{
parent::__construct('mysql:host=localhost;dbname=' . $db, $user, $pass);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
}
catch(PDOException $e)
{
$this->error(array($e->getCode(), $e->getMessage(), '08006'));
}
}
function query($query)
{
$stmt = parent::query($query);
if ($stmt !== false)
return $stmt;
else
{
$this->error($this->errorInfo(), $query);
return false;
}
}
function error($info, $query = false)
{
// log error here
}
}
显然,我已经覆盖了prepare()和exec()方法,以及语句类的execute()方法。当那些(或上面的query())有错误时,它们都可以正常工作。问题是当PDO无法连接到数据库时,我得到了“PHP致命错误:调用成员函数错误()对非对象”错误,包含在catch中。
我已经尝试用catch替换MyPDO :: error(),但这似乎没有做任何错误。我很难解决问题所在。
答案 0 :(得分:4)
看起来像PDO中的错误。下面按预期打印“NULL”而不是“object(MyPDO)”。
class MyPDO extends PDO
{
public function __construct() {
try {
parent::__construct(111);
} catch(Exception $e) {
var_dump($this);
}
}
}
$p = new MyPDO;
PDO :: construct似乎在对象完全初始化之前抛出异常。
他们说已经修复了http://bugs.php.net/bug.php?id=52053,所以请尝试升级到最新版本。