Beware when using stored procedures:
If you connect to the database and then call dbproc A followed by a call to db proc B and then close the connection to the db, the second procedure call will not work.
It looks like there is a bug in MYSQL or mysqli that returns an extra recordset than you would expect. It then doesn't let you call another stored procedure until you finish processing all the recordsets from the first stored procedure call.
The solution is to simply loop through the additional recordsets between calls to db procs. Here is a function that I call between db proc calls:
<?php
#--------------------------------
function ClearRecordsets($p_Result){
#--------------------------------
$p_Result->free();
while($this->Mysqli->next_result()){
if($l_result = $this->Mysqli->store_result()){
$l_result->free();
}
}
}
?>
mysqli::store_result
mysqli_store_result
(PHP 5)
mysqli::store_result -- mysqli_store_result — 直近のクエリから結果セットを転送する
説明
オブジェクト指向型(メソッド):
手続き型:
mysqli_data_seek() で使用される、 link で表されたデータベース接続の直近のクエリ から結果セットを転送します。
返り値
バッファに格納した結果オブジェクトを返します。エラー時には FALSE を返します。
注意: mysqli_store_result() は、クエリが結果セットを 返さなかった場合(例えば、クエリが INSERT 文であった場合)に FALSE を返します。また、結果セットの読み込みに失敗した場合にも FALSE を返します。エラーが発生したかどうかを調べるには、 mysqli_error() が空文字列以外を返す・ mysqli_errno() がゼロ以外の値を返す・あるいは mysqli_field_count() がゼロ以外の値を返す のいずれかを確認します。それ以外にこの関数が FALSE を返す理由としては mysqli_query() のコールに成功して返された 結果セットが大きすぎる(メモリに割り当てられない)場合がありえます。 もし mysqli_field_count() がゼロ以外の値を 返した場合、文は空でない結果セットを生成しています。
注意
注意: クエリ結果が使用するメモリを mysqli_free_result() 関数で開放するのは、どんな場合でも大切です。しかし、大きい結果セットを mysqli_store_result() で転送した際は、特にこれが 重要となります。
例
mysqli_multi_query() を参照ください。
mysqli::store_result
13-Apr-2007 01:29
