2017-07-21 19 views
0

db接続パラメータは、必要なすべてのページに含まれる単一のファイルに設定されています。接続ファイルそう...と呼ばれるconnect.phpのようになります。pdo db接続が存在しない場合のエラー処理?

$db_host  = '111.111.111.111'; 
$db_database = 'test'; 
$db_user  = 'test'; 
$db_pass  = 'test'; 
$db_port  = '3306'; 

//db connection 
try { 
    $db = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_database;charset=utf8", $db_user, $db_pass, 
     array(
      PDO::ATTR_EMULATE_PREPARES => false, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //PDO::ERRMODE_SILENT is default setting 
      PDO::ATTR_PERSISTENT => false //when true 
      ) 
    ); 
} 
catch(PDOException $e) { 
    error_log("Failed to connect to database (/connect.php): ".$e->getMessage()); 
} 

私は、このファイルが含まれており、このようなもので終わるデシベルで物事を行う必要があります... example.php呼ば:

require $_SERVER['DOCUMENT_ROOT'].'/assets/functions/connect.php'; 

$stmt = $db->prepare(" 
    SELECT 
     accounts.account_id, 
    FROM accounts 
    WHERE accounts.account_key = :account_key 
"); 

//bindings 
$binding = array(
    'account_key' => $_POST['account_key'] 
); 
$stmt->execute($binding); 
//result (can only be one or none) 
$result = $stmt->fetch(PDO::FETCH_ASSOC); 

//if result 
if($result) 
{ 
    // result found so do something 
} 

ときどきデータベース接続が失敗します(更新、シャットダウン、それは何でも)... PDOExceptionが発生すると、try/catchが正常に動作し、私の中にエントリが追加されますエラーログはそう言っています。

私のexample.phpに 'check'を追加すると、接続がない場合でもデータベース作業は行われません(接続スクリプトを含むインクルードファイルが接続)。どのように私はこれについて行って、そうするための好ましい方法は何ですか?

$ stmtエントリの前に$ dbをテストする正しい方法がわかりません。それが設定されていない場合、接続を再試行する方法がありますか?

私はそれをそのまま残すことができ、問題がないことを認識しています。データベースクエリ以外は失敗し、コードは実行されませんが、このときエラーログに別のエントリを追加するなど、起こる

+0

これらのすべてを例外処理コードで実行します。 – Shadow

+0

しかし、接続例外処理で、DB接続がダウンしていることを示すフラグを設定することもできます。ほとんどの場合、xouは完全にここでの処理を止めるでしょう、それがうまくいかないとスクリプトを続行することに意味はありません。 – Shadow

答えて

1

さらに処理を停止するには、finallyブロックを適用する場合を除き、各catchブロックの末尾にexit()を追加してください。

try { 
    //... 
} catch(PDOException $e) { 
    // Display a message and log the exception. 
    exit(); 
} 

また、投げる例外と真/偽/ nullの検証は、データアクセスを含む全体の接続/準備/フェッチ/クローズ操作を介して適用されなければなりません。あなたは私のポストを見てみたいことがあります。

あなたのアイデアDB接続ファイルを含めて、私はあまりにも、良い見つけます。しかし、require_onceを使用することを考えてください。そうすれば、DB接続は一回だけ作成されます。

注:私の例では、すべての例外/エラーをアプリケーションのエントリポイントでのみ処理する必要があるという事実をエミュレートするソリューションを実装しました。したがって、MVCコンセプトに向けられています。このコンセプトでは、すべてのユーザーリクエストが1つのファイルindex.phpで送信されます。このファイルでは、ほぼすべてのtry-catch状況を処理する必要があります(ログと表示)。他のページの内部では例外がスローされ、エントリポイントに到達するまで上位レベルに再スローされます(例:index.php)。

DBへの再接続に関して、どのようにtry-catchと相関させるべきかはまだ分かりません。しかし、とにかく最大3ステップ反復を意味するはずです。

+0

そのため、connect.phpファイルに 'exit();'を追加するだけで、example.phpで必要な呼び出しが終わった後にすべてを停止することができますか? – user756659

+0

私はconnect.phpのエラーログエントリが素晴らしい間に問題があると思います...私はexample.phpでエラー処理を行う必要があります。それは私が意味することを知っているなら、私はその特定のページで何をしたいのかをするための接続がない場合、何か他のことをする必要があるということです。たとえば、アプリケーションと「話す」PHPスクリプトがあります.dbからの応答がなく、何もできない場合は、アプリに何らかの形で処理して、それがないことを知らせる必要がありますその時のdb接続。うまくいけばそれは理にかなっている。 – user756659

+0

@ user756659はい。例外がスローされると、プログラムはエラーが発生しやすい文に続く他の文の処理を停止し、catchブロックに直接ジャンプします。そこではあなたが望むように例外を処理することができます。しかし、もしあなたが 'exit()'関数を実装しなければ、プログラムはcatchブロックの後のステートメント、またはfinallyブロックの中にあるステートメントがあればそれを継続します。 –

関連する問題