[PHP-users 14856]Re: [PHP-users14665]PEARでクエリが実行されるときとされない時がある

sorako yamamoto sorako_yamamoto @ hotmail.com
2003年 4月 24日 (木) 02:06:20 JST


こんにちは。Setoさん、返信ありがとうございます。

なんとなく原因が分かってきたような…
感じ的にトランザクションの問題ではないかという気がしてます。
エラーになってしまうのが、select文を実行した時の画面だったため、
提示コードもselectクエリ実行部分のみだったのですが、

実際には、execSelect()とupdateSelect()の2つの関数で処理を行っています。
(なので、exec()という関数は使用してないです…紛らわしくてすみません。)

/* DB関数 */
// selectを実行させる場合。
function execSelect( $sQuery )
{
	$DNS = "pgsql://unix()/Test" ;
	$objCon = DB::connect( $DNS, true);	// DBへ接続

	if ( DB::isError($objCon ) ) {
		die( "接続エラー" );
	}
	$objCon->setErrorHandling( PEAR_ERROR_CALLBACK, "myDBErrorHandler" );
	$objRs = $objCon->query( $sQuery );

	while( $row = $objRs->fetchRow( DB_FETCHMODE_ASSOC ) ) {
		$aResult[] = $row ;
	}
	return $aResult ;
}
// insert updateを実行させる場合。
function execUpdate( $sQuery )
{
	$DNS = "pgsql://unix()/Test" ;
	$objCon = DB::connect( $DNS, true);	// DBへ接続

	if ( DB::isError($objCon ) ) {
		die( "接続エラー" );
	}
	$objCon->setErrorHandling( PEAR_ERROR_CALLBACK, "myDBErrorHandler" );

	// トランザクションの開始
	$this->db->query("BEGIN") ;
	$objRs = $objCon->query( $sQuery );

	// コミット
	$this->db->query("COMMIT") ;
	return ;
}

// エラー時に呼び出される。
function myDBErrorHandler()
{
  print( "DBエラー" );
}


/* 呼び出し側 */
// select実行画面
$aResult = execSelect( "select * from test_table ") ;
$cnt = count($aResult) ;
for( $i=0 ; $i < $cnt ; $i++ ) {
    print $aResult[$i]["col1"] ;
    print $aResult[$i]["col2"] ;
}

// insert実行画面
execUpdate("insert into test_table values( 'xxxx', 'ssss', 'aaaa')") ;


> pgsqlより
> >「current transaction is aborted, queries ignored until 
> >end of transaction block」
> トランザクションが発生している箇所が記載されてませんので
> 提示されたコードだけの問題ではなさそうですね。
> または記載された関数をつかってBEGINを発行して
> その後のfetchRowでエラーになってるとか。

このソースでは、
execUpdate()で、ロールバックも何も行っていないのですが、
(1つのSQLしか処理しないので、あえてロールバックを行う必要もないのかなと思い
入れてませんでしたが…?)
この作りに問題があるのでしょうか。
もし、エラーになった場合、BEGIN発行後、COMMITは行われないですよね。

insert実行画面でexecUpdate()を実行し、何らかのエラーが発生した場合、
その後、select実行画面を表示すると
execSelect()が正常に実行されたり、されなかったり
という現象になってしまっているのでしょうか。

PHPというよりPostgresの問題の様ですが…

すみませんが、ご意見ください。
よろしくお願いします。



_________________________________________________________________
最新のファイナンス情報とライフプランのアドバイス MSN マネー  
http://money.msn.co.jp/  



PHP-users メーリングリストの案内