9

php を使用して Web ページ上のクエリのエラーを (選択した方法で) キャッチして表示したいと考えています。したがって、以下のコードの代わりに

$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 errcode を取得することは可能ですが、トリックがあります。クエリは、同期の代わりに非同期の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
      }
    }
  }  
}

また、@ user1760150 のコメントに記載されているように、渡された引数に(セミコロンで区切られた)複数の SQL ステートメントpg_queryが含まれている可能性がある場合は、上記の例を拡張してすべての結果をループで取得する必要があります。最後の結果のみを返すのと比較して、ループ内では、結合されたクエリの各ステートメントの結果にアクセスできます。pg_querypg_get_result

于 2012-09-10T12:08:21.200 に答える
2

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 に答える