!それは次のように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
以上を取ることはありません。まだトランザクションでテストしていませんが、まだそのトリックを行う必要があります。
質問自体は面白いですが、実際にはクエリを起動して例外をキャプチャする方が簡単でしょう。 –
私の実装では 'isConnected()'を使いたいと思います。もしfalseならconnectメソッドをトリガーします。私はmysqli :: ping();のように、PDOをMySQLiに置き換えたくありません。好奇心から=) –
私はÁlvaroG. Vicarioに完全に同意します!しかし、私が正しく理解していれば、属性はデータベースドライバの依存であるため、あなたが話しているデータベース/バージョンに依存していると思います。回答1:成功した場合はデータベースからの回答、失敗した場合はNULLです。 Answer 2:私はそれがどのDBドライバに依存すると言いますか... – bestprogrammerintheworld