結果セットを返すストアドプロシージャを呼び出すと明らかになる厄介なバグ(または機能)があるようです。 。つまりINTO句のないselectステートメントで終わるストアドプロシージャ(以下の例を参照)。
mysqliドライバーは(適切に)2つの結果セットを返します。 1つ目はストアドプロシージャから返されるもので、2つ目はダミーの空の結果セットです。これは、複数のクエリコマンドが発行されたようなものです。これに対する1つの解決策(通常の(SELECTなど)クエリで中断しない)は、正当な結果セット(最初のクエリ)を処理した後にこのダミーの結果セットを使用することです。
phpコードの例
function do_query($con, $sql)
{
if ( !($result = mysqli_query($con, $sql)) )
throw new QueryException(mysqli_error($con));
if ($result === true)
return true;
while ($row = mysqli_fetch_assoc( $result )) {
// process rows
}
// Hack for procedures returning second dummy result set
while(mysqli_more_results($con)) {
mysqli_next_result($con);
// echo "* DUMMY RS \n";
}
}
ストアドプロシージャの例:
CREATE PROCEDURE selectStaleHeaders()
NOT DETERMINISTIC
SELECT TT.*
FROM one_pretty_table AS TT
LEFT JOIN another AS AN on TT.fk_id = AN.id
WHERE TT.id IS NULL;