Wygląda na to, że istnieje paskudny błąd (lub funkcja), który objawia się podczas wywoływania procedury składowanej, która zwraca zestaw wyników. . Tj. procedura składowana, która kończy się instrukcją select bez klauzuli INTO (patrz przykład poniżej).
Sterownik mysqli (prawdopodobnie) zwraca 2 zestawy wyników. Pierwszy to ten, który został zwrócony z procedury składowanej, a drugi fikcyjny, pusty zestaw wyników. To tak, jakby wydano polecenie wielokrotnego zapytania. Jednym z rozwiązań tego problemu (które nie psuje się w przypadku zwykłych zapytań (np. SELECT)), jest użycie tego fałszywego zestawu wyników po przetworzeniu prawidłowego (pierwszego).
Przykładowy kod 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";
}
}
Przykładowa procedura składowana:
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;