Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP pg_query_params()记录SQL错误_Php_Postgresql - Fatal编程技术网

PHP pg_query_params()记录SQL错误

PHP pg_query_params()记录SQL错误,php,postgresql,Php,Postgresql,我认为所有的pg_*函数在出错时都返回false,检查它是你的工作。但是,如下所示,我的服务器正在向PHP日志输出一条错误消息。当我通过检查查询结果对象的错误代码来处理此类异常时,我显然不希望这些消息污染日志,因此如何防止这种情况发生 警告:pg_query_params():查询失败:错误:重复键值违反唯一约束“电子邮件”详细信息:键(电子邮件)=(email@example.com)已经存在。从php的角度来看,在第100行的/xxx.php中,至少有两种方法可以避免错误消息,一种是“快速且

我认为所有的pg_*函数在出错时都返回false,检查它是你的工作。但是,如下所示,我的服务器正在向PHP日志输出一条错误消息。当我通过检查查询结果对象的错误代码来处理此类异常时,我显然不希望这些消息污染日志,因此如何防止这种情况发生


警告:pg_query_params():查询失败:错误:重复键值违反唯一约束“电子邮件”详细信息:键(电子邮件)=(email@example.com)已经存在。从php的角度来看,在第100行的/xxx.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错误日志中都会有错误的痕迹,除非您在那里也将其静音,但这是一个单独的问题,通常通过在过程代码中使用带有错误捕获的服务器端插入而不是客户端来解决。

@sign是一个巧妙的技巧,但我的观点是我正在执行解决方案2,但它仍然发送一个错误到日志。@sevado:pg#u query#params将输出错误,但不是像我建议的那样发送查询参数。完全错过了。我确实切换到了pg_send_query,所以我可以使用pg_result_error,但我忘了检查该函数是否也输出到log,但您刚刚回答了这个问题。谢谢