8

我几乎整天都在研究这个..似乎无法在任何地方找到返回的值。有人可以告诉我:

  1. 返回什么值PDO::getAttribute(PDO::ATTR_CONNECTION_STATUS);
  2. 是否可以依靠其结果来确定连接是否仍然存在?(最终,我可以用什么来检查连接是否仍然存在?)
4

1 回答 1

4

最后!事实证明,该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
}

原因:
PDO::query();返回包含结果的数组或 false,在当前情况下它不会返回任何内容,因为连接已死,PDO 应该向我们抛出异常。这就是我们所期待的。catch 块将返回 false 并且不会停止我们的脚本的执行。使用的查询

选择 1+1;

将始终返回 2 并且由于它是在 DB 端计算的,因此值得信赖。没有联系,没有结果!这不是矫枉过正,因为它是非常简单的查询,并且大多数数据库(在普通共享主机上)都在本地主机上,它不会占用更多的时间0.0000s,这并不是一个性能问题。尚未使用事务对其进行测试,但仍然可以解决问题。

于 2013-03-26T17:44:51.653 回答