0

すべてのpg_*関数はエラー時にfalseを返すと思いましたが、それをチェックするのはあなたの仕事です。ただし、以下に示すように、サーバーはPHPログにエラーメッセージを出力しています。クエリ結果オブジェクトのエラーコードをチェックしてこの種の例外を処理するときに、これらのメッセージがログを汚染することを明らかに望まないため、これを防ぐにはどうすればよいですか。

Warning: pg_query_params(): Query failed: ERROR: duplicate key value violates unique constraint "email" DETAIL: Key (email)=(email@example.com) already exists. in /xxx.php on line 100

4

1 に答える 1

2

PHP の観点からは、エラー メッセージを回避する方法が少なくとも 2 つあります。

解決策 #1 : 呼び出しの前に @ 記号を追加して、エラー メッセージをミュートします。

@pg_query_params($db, $query, $params);

欠点は、失敗の理由が何であれログが残らないことです。

解決策 #2 : pg_send_query_params () を使用し、エラー コードを処理し、それが予期されたエラーであることを確認し、この場合のみ無視し、そうでない場合はエラーを発生させます。サンプルコード:

if (pg_send_query_params($db, $query, $params)) {
  $res=pg_get_result($db);
  if ($res) {
    $state = pg_result_error_field($res, PGSQL_DIAG_SQLSTATE);
    if ($state==0) {
      // success
    }
    else {
      // an error happened
      if ($state=="23505") { // unique_violation
        // process or ignore expected error
      }
      else {
        // process other errors
        trigger_error (pg_last_error(), E_USER_ERROR);  
      }
    }
  }  
}
else { 
 trigger_error ("pg_send_query_params failed:".pg_last_error(), E_USER_ERROR);
}

どちらの場合も、PostgreSQL のエラー ログにエラーの痕跡が残りますが、これは別の問題であり、サーバー側の INSERT を使用して手続き型コードでエラー トラップを行うことで解決されます。クライアント側。

于 2013-01-13T17:06:54.683 に答える