PHP pg_query_params() SQL错误日志


PHP pg_query_params() Logs SQL Errors

我认为所有的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

从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而不是客户端来解决。