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