2011年12月15日木曜日

pg_queryでSQLの失敗時にFALSEを返さない


PHPからPostgreSQLへpg_queryでSQL文を実行してみている。
その時に、構文間違いやデータ整合性などの理由で失敗する。
で、エラーを出して終了してしまう。

マニュアルによるとFALSEを返すはずなんだけど…。
とりあえずset_error_handlerでカスタムエラーハンドラを作って対処してみた。



function pg_query_test( $conn )
{
  $sql = "INSERT INTO NO_EXIST_TABLE VALUES ( 1 );";
  // エラー終了させないようエラーハンドラをセット
  set_error_handler( "my_error_handler" );
  $result = pg_query( $conn, $sql );
  restore_error_handler();if ( $result )
  {
    return true;
  }
  else
  {
    return false;
  }
}
function my_error_handler( $errno, $errstr, $errfile, $errline )
{
  echo "[errno]:   $errno\n";
  echo "[errstr]:  $errstr\n";
  echo "[errfile]: $errfile\n";
  echo "[errline]: $errline\n";
}
?>


実行してみて、errnoは2(E_WARNING)と分かった。
しかし、pg_queryの前でset_error_handlerして、終わったらrestore_error_handlerってのもあんまりスマートなやり方じゃないね…。
ひとまずこれで行っておくか…。

と思いきや、pg_queryだけじゃなくて、pg_copy_fromなんかでも同じようにエラーを出して終了しちゃう…。
さすがにpg_系が全部間違っているとは考えにくいので、DBかPHPの設定?と思い、とりあえず/etc/php.iniを見てみた。
"Error handling and logging"の部分で、
error_reporting  =  E_ALL
となっているのを発見。

試しに関数内で
error_reporting( E_ERROR );
にしてみたところ、失敗してもちゃんとFALSEを返すようになった!

ただ、これだと毎回error_reporting関数を呼ばなくちゃいけないので、面倒。
/etc/php.iniを変えて問題なければ、書き換えたほうが楽だね。
多分、問題ないけど検証してからやってみよう!

0 件のコメント: