Sembra esserci un brutto bug (o funzionalità) che si manifesta quando si chiama una stored procedure che restituisce un set di risultati. . Cioè. una procedura memorizzata che termina con un'istruzione select senza una clausola INTO (vedi esempio di seguito).
Il driver mysqli (probabilmente) restituisce 2 set di risultati. Il primo è quello restituito dalla procedura memorizzata e il secondo un set di risultati fittizio e vuoto. È come se fosse stato emesso un comando di query multiple. Una soluzione a questo (che non si interrompe con le solite query (ad es. SELECT)) è consumare questo set di risultati fittizi dopo aver elaborato quello legittimo (il primo).
Esempio di codice 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";
}
}
Esempio di procedura memorizzata:
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;