web-dev-qa-db-ja.com

PDO接続テスト

私は自分のアプリの1つ用のインストーラーを書いていますが、いくつかのデフォルトのデータベース設定をテストしたいと思います。

PDOを使用して有効なデータベース接続と無効なデータベース接続をテストすることは可能ですか?

私は次のコードを持っています:

try{
            $dbh = new pdo('mysql:Host=127.0.0.1:3308;dbname=axpdb','admin','1234');
            die(json_encode(array('outcome' => true)));
        }catch(PDOException $ex){
            die(json_encode(array(
                'outcome' => false,
                'message' => 'Unable to connect'
            )));
        }

私が抱えている問題は、スクリプトがデータベースに接続できないと言うのではなく、60秒のスクリプト実行時間がなくなるまで接続しようとすることです。

ありがとう

32
Lee Fenlan

データベースへの接続時にエラーモードを設定する必要があります。

try{
    $dbh = new pdo( 'mysql:Host=127.0.0.1:3308;dbname=axpdb',
                    'admin',
                    '1234',
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    die(json_encode(array('outcome' => true)));
}
catch(PDOException $ex){
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
}

詳細については、次のリンクを参照してください。

PDOでMySQLを使用

エラーとエラー処理

43
Sascha Galley

@Sascha Galleyが既に述べたように、エラーモードを例外モードに設定する必要があります。ただし、 PDO::ATTR_TIMEOUT 属性は、場合によっては応答を長時間待つことを防ぎます。

MySQLの場合、この属性の動作はドライバーに依存しているとドキュメントに記載されていますが、これは接続タイムアウトです。あなたはそれについて何も見つけられません documentation ですが、これはドライバーのソースコードからの短い断片です:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);
10
Crozin

見られるように この回答 (ただし、他のどこにもほとんどないので、ここでよりわかりやすくしました)、「クラシック」_PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION_ソリューション常に動作しない

_PDO::ERRMODE_EXCEPTION_ 壊れている の実装なので、場合によっては「リーク」しているようです。

例えば:

警告:PDO :: __ construct()[pdo .-- construct]:[2002]ターゲットマシンが積極的に拒否したため、接続できませんでした。 (tcp:// localhost:3306を介して接続しようとしています)[...]db.phpの行34

そこのコード:

_try {
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch {
    echo("Can't open the database.");
}
_

例外isがスローされました(そして、キャッチされました:私のメッセージを見ることができます)。

そのため、必要な回避策として、_@_(「おむつ演算子」と呼びましょうこの場合)new pdo(...)の前に実際にクリーンに保ちます。

2
Sz.

PDO :: ERRMODE_EXCEPTIONの最後に閉じ括弧がありません。

する必要があります:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
1
Denis St-Michel