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 的角度来看,至少有两种方法可以避免错误消息,一种是“快速而肮脏”,另一种是更复杂但干净。

解决方案#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 回答