7
我一直在寻找这个几乎整天......并且似乎无法找到返回值的任何地方。有人可以告诉我:PDO :: getAttribute(PDO :: ATTR_CONNECTION_STATUS)有什么可能的结果
PDO::getAttribute(PDO::ATTR_CONNECTION_STATUS);
返回什么值?- 是否有可能依靠其结果确定的连接是否还活着?(最终,有什么事情我来检查连接是否还活着?)
我一直在寻找这个几乎整天......并且似乎无法找到返回值的任何地方。有人可以告诉我:PDO :: getAttribute(PDO :: ATTR_CONNECTION_STATUS)有什么可能的结果
PDO::getAttribute(PDO::ATTR_CONNECTION_STATUS);
返回什么值?终于来了!事实证明,在mysqli::ping()
函数可以内PDO实现如下:
class PDOExtended extends PDO {
public function __construct($dsn, $user, $pass, $options = array())
{
$this->link = parent::__construct($dsn, $user, $pass, $options);
$this->link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
}
// some methods
public function isConnected()
{
try {
return (bool) $this->link->query('SELECT 1+1');
} catch (PDOException $e) {
return false;
}
}
//some other methods
}
原因:
包含结果还是假的,在目前的情况下,将没有什么回报,的Cuz PDO::query();
返回数组连接已经死亡,PDO应该向我们抛出异常。这就是我们所期待的。 catch块将返回false,并且不会停止脚本的执行。所用查询
SELECT 1 + 1;
将总是返回2,并且由于它是在DB侧计算的,所以依赖它是很好的。没有连接,没有结果!这不是一个矫枉过正的事情,因为它非常简单,查询和大部分数据库(在普通共享主机上)都在本地主机上,因此它不会超过0.0000s
,这不是性能问题。还没有用交易进行测试,但仍然应该这样做。
这个问题本身很有趣,但实际上,启动查询并捕获异常可能更容易。 – 2013-03-26 16:55:54
对于我的实现,我希望使用'isConnected()',如果false将触发连接方法。我不想用MySQLi替换PDO,只是因为'mysqli :: ping();'。刚刚出于好奇=) – 2013-03-26 17:00:02
我完全同意ÁlvaroG. Vicario!但是,如果我理解它的权利,属性是依赖于数据库驱动程序,所以我想这取决于你在谈论哪个数据库/版本。答案1:如果成功,则返回数据库,如果不成功则返回NULL。回答2:我会说这取决于哪个db-driver ... – bestprogrammerintheworld 2013-03-26 17:00:16