2013-03-26 11 views
7

私はこれをほぼ一日中探しています。どこでも返された値を見つけることができないようです。誰かが私に教えてください:PDO :: getAttribute(PDO :: ATTR_CONNECTION_STATUS)の考えられる結果は何ですか?

  1. PDO::getAttribute(PDO::ATTR_CONNECTION_STATUS);はどのような値を返しますか?
  2. それは?接続がまだ生きているかどう確定するために、その結​​果に依存することは可能です(そして最終的に、私は、接続がまだ生きているかどうかを確認するために何を使うだろうか?)最後に
+0

質問自体は面白いですが、実際にはクエリを起動して例外をキャプチャする方が簡単でしょう。 –

+0

私の実装では 'isConnected()'を使いたいと思います。もしfalseならconnectメソッドをトリガーします。私はmysqli :: ping();のように、PDOをMySQLiに置き換えたくありません。好奇心から=) –

+0

私はÁlvaroG. Vicarioに完全に同意します!しかし、私が正しく理解していれば、属性はデータベースドライバの依存であるため、あなたが話しているデータベース/バージョンに依存していると思います。回答1:成功した場合はデータベースからの回答、失敗した場合はNULLです。 Answer 2:私はそれがどのDBドライバに依存すると言いますか... – bestprogrammerintheworld

答えて

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();戻り値Array接続が壊れていて、PDOが私たちに例外を投げるべきです。それが私たちが期待していることです。 catchブロックはfalseを返し、スクリプトの実行を停止しません。使用されたクエリ

SELECT 1 + 1;

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