Der ser ud til at være en grim fejl (eller funktion), der manifesteres, når du kalder en lagret procedure, der returnerer et resultatsæt. . dvs. en lagret procedure, der slutter med en select-sætning uden en INTO-sætning (se eksempel nedenfor).
Mysqli-driveren returnerer (formentlig) 2 resultatsæt. Den første er den, der returneres fra den lagrede procedure, og den anden er et dummy, tomt resultatsæt. Det er som om en kommando med flere forespørgsler blev udstedt. En løsning på dette (som ikke går i stykker ved sædvanlige (f.eks. SELECT) forespørgsler), er at forbruge dette dummy-resultatsæt efter at have behandlet det legitime (det første).
Eksempel php-kode
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";
}
}
Eksempel på lagret procedure:
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;