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を返し、スクリプトの実行を停止しません。使用したクエリ

SELECT 1 + 1;

は常に2を返しますが、DB側で計算されるため、信頼することをお勧めします。接続なし、結果なし!非常に単純なクエリであり、ほとんどのデータベース(通常の共有ホスト上)がローカルホスト上にあるため、これ以上かかること0.0000sはなく、パフォーマンスの問題はそれほど多くありません。まだトランザクションでテストしていませんが、まだトリックを実行する必要があります。

于 2013-03-26T17:44:51.653 に答える