web-dev-qa-db-ja.com

新しいmysqli():「接続できません」エラーをインターセプトする方法?

私はこれをやっています(はい、間違った接続データを使用しています、それは接続エラーを強制することです)

try {
    $connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;
} catch (Exception $e ) {
    echo "Service unavailable";
    exit (3);
}

しかしPHPはこのphp_warningを実行しています:

mysqli :: mysqli():(28000/1045):ユーザー 'my_user' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)

この例では、接続エラーを強制するために間違った接続データを使用していますが、現実の世界ではデータベースがダウンしているか、ネットワークがダウンしている可能性があります。

質問:警告を抑制せずにデータベース接続の問題をインターセプトする方法はありますか?

15
realtebo

Mysqliに例外をスローするように指示する必要があります。

mysqli_report(MYSQLI_REPORT_STRICT);

try {
     $connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;
} catch (Exception $e ) {
     echo "Service unavailable";
     echo "message: " . $e->message;   // not in live code obviously...
     exit;
}

これで例外をキャッチし、そこから取得できます。

41
jeroen

PHP 5.2.9+

if ($mysqli->connect_error) {
    die('Connect Error, '. $mysqli->connect_errno . ': ' . $mysqli->connect_error);
}

Jeroenが示唆するように、レポートモードも厳密なレベルに設定する必要がありますが、上記のコードは接続エラーを明確に検出するのに役立ちます。これら2つのアプローチの組み合わせは、 PHPマニュアル で推奨されています。

10
TonyArra

小切手 $connection->connect_error値。

ここの例を参照してください: http://www.php.net/manual/en/mysqli.construct.php

2
Uby