16

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

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)

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

質問:警告を抑制せずに、データベース接続の問題を傍受する方法はありますか?

4

4 に答える 4

41

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;
}

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

于 2013-03-21T17:04:11.023 に答える
10

PHP5.2.9以降の場合

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

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

于 2013-03-21T16:58:44.333 に答える
2

値を確認してください$connection->connect_error

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

于 2013-03-21T16:59:03.487 に答える
-3

mysqli_report(MYSQLI_REPORT_STRICT);は、他の場所で説明されているように、エラーを表示し、スクリプトをすぐに停止します。しかし、これは私にとって望ましい出力を提供するようです...

error_reporting(E_ERROR);

$connection = new mysqli('localhost', 'my_user', 'my_password', 'my_db') ;

error_reporting(E_ERROR | E_WARNING | E_PARSE);

if($connection->connect_errno)
{
  // Database does not exist, you lack permissions, or some other possible error.
    if(preg_match($connection->connect_error, "Access denied for user"))
    {
        print("Access denied, or database does not exist.");
    }
    else
    {
        print("Error: " . $connection->connect_error);
    }
}

try..catch()でこのエラーをキャッチしようとすると、失敗します。

于 2016-05-30T00:30:14.027 に答える