PHP pg_query_params()记录SQL错误

时间:2013-01-13 11:47:41

标签: php postgresql

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

1 个答案:

答案 0 :(得分: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和错误捕获来解决代码而不是客户端。