2013-03-26 78 views
7

我一直在寻找这个几乎整天......并且似乎无法找到返回值的任何地方。有人可以告诉我:PDO :: getAttribute(PDO :: ATTR_CONNECTION_STATUS)有什么可能的结果

  1. PDO::getAttribute(PDO::ATTR_CONNECTION_STATUS);返回什么值?
  2. 是否有可能依靠其结果确定的连接是否还活着?(最终,有什么事情我来检查连接是否还活着?)
+0

这个问题本身很有趣,但实际上,启动查询并捕获异常可能更容易。 – 2013-03-26 16:55:54

+0

对于我的实现,我希望使用'isConnected()',如果false将触发连接方法。我不想用MySQLi替换PDO,只是因为'mysqli :: ping();'。刚刚出于好奇=) – 2013-03-26 17:00:02

+0

我完全同意ÁlvaroG. Vicario!但是,如果我理解它的权利,属性是依赖于数据库驱动程序,所以我想这取决于你在谈论哪个数据库/版本。答案1:如果成功,则返回数据库,如果不成功则返回NULL。回答2:我会说这取决于哪个db-driver ... – bestprogrammerintheworld 2013-03-26 17:00:16

回答

3

终于来了!事实证明,在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,这不是性能问题。还没有用交易进行测试,但仍然应该这样做。