9

我想使用 php 在网页上捕获并显示错误(以我选择的方式)。所以代替下面的代码

$result=pg_query($connection,$query);

if($result){
    //success

}
else{
    echo pg_last_error($connection);
}

我可以使用错误代码匹配之类的方法或其他方法来实现诸如

if(error equals duplicate value error){
 echo "this value already exists";
}
else if(error equals different type error){
 echo "You should enter wrong type for column blabla"
}

注意我正在使用 postgresql

4

3 回答 3

17

可以检索所需的标准SQLSTATE错误代码,但有一个技巧:查询必须通过异步pg_send_query()而不是同步发送pg_query()。这是因为pg_query()返回false错误而不是查看错误详细信息所需的资源。

pg_get_result()在 之后调用pg_send_query时,它无论如何都会阻塞,直到查询完成,因此与同步情况相比,它并没有真正使事情复杂化。它返回的结果可以被充分利用以进行精确的错误处理。

例子:

if (pg_send_query($db, $query)) {
  $res=pg_get_result($db);
  if ($res) {
    $state = pg_result_error_field($res, PGSQL_DIAG_SQLSTATE);
    if ($state==0) {
      // success
    }
    else {
      // some error happened
      if ($state=="23505") { // unique_violation
        // process specific error
      }
      else {
       // process other errors
      }
    }
  }  
}

此外,如果传递给的参数pg_query可能包含多个 SQL 语句(用分号分隔),则应扩展上述示例以检索循环中的所有结果,如 @user1760150 的评论中所述。与pg_query仅返回最后一个结果相比,pg_get_result在循环中可以访问组合查询的每个语句的结果。

于 2012-09-10T12:08:21.200 回答
6

您应该解析返回pg_last_error以了解错误的类型。所以我会这样去做:

$result = pg_query($connection,$query);

if($result)
{
  //success
}
else
{
  $error = pg_last_error($connection);

  // you need to adapt this regex
  if (preg_match('/duplicate/i', $error))
  {
    echo "this value already exists";
  }
  // you need to adapt this regex
  elseif(preg_match('/different type/i', $error))
  {
    echo "You should enter wrong type for column blabla"
  }
  else
  {
    // different error
  }
}
于 2012-09-10T09:58:52.367 回答
2

可以通过两个主要驱动程序访问 SQLSTATE。

http://uk3.php.net/manual/en/function.pg-result-error-field.php

http://www.php.net/manual/en/pdo.errorcode.php

于 2012-09-10T11:27:36.310 回答