more_results
Scopri la funzione mysqli_more_results() in PHP, utilizzata per verificare se esistono altri result set da una multi-query.
La funzione mysqli_more_results() verifica se è ancora disponibile un altro result set dopo aver eseguito più istruzioni SQL contemporaneamente con mysqli_multi_query(). È uno degli strumenti del piccolo toolkit che si usa per scorrere i risultati di una query multi-istruzione. Questo articolo ne spiega la sintassi, il valore restituito, il pattern di ciclo a cui appartiene e le insidie più comuni.
Sintassi
mysqli_more_results(mysqli $mysql): boolNello stile orientato agli oggetti lo stesso metodo è $mysqli->more_results().
Parametro
$mysql— un oggetto di connessione MySQLi restituito damysqli_connect()(onew mysqli(...)).
Valore restituito
mysqli_more_results() restituisce true se uno o più result set sono ancora disponibili dall'ultima chiamata a mysqli_multi_query(), e false se non ce ne sono altri. Non avanza al set successivo — per farlo si chiama mysqli_next_result().
Quando si usa?
Una singola mysqli_query() restituisce un solo result set, quindi mysqli_more_results() non è mai necessaria in quel caso. È rilevante solo con mysqli_multi_query(), che consente di inviare più istruzioni separate da ; in un unico round trip — ad esempio la chiamata a una stored procedure che restituisce più SELECT, oppure uno script di importazione batch. mysqli_more_results() è la condizione del ciclo che indica quando fermarsi.
Il pattern di ciclo standard
Tre funzioni lavorano insieme:
| Funzione | Ruolo |
|---|---|
mysqli_more_results() | Esiste un altro result set in arrivo? |
mysqli_next_result() | Avanza al result set successivo. |
mysqli_store_result() | Recupera il result set corrente per poter leggere le righe. |
<?php
$mysqli = mysqli_connect("localhost", "user", "pass", "demo");
mysqli_multi_query($mysqli, "SELECT 1 AS n; SELECT 2 AS n; SELECT 3 AS n;");
do {
// Fetch the result set for the current statement.
if ($result = mysqli_store_result($mysqli)) {
$row = mysqli_fetch_assoc($result);
echo "Result: {$row['n']}\n";
mysqli_free_result($result);
}
// Keep going only while another set is queued AND we can advance to it.
} while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
mysqli_close($mysqli);
?>Per le tre istruzioni sopra questo stampa:
Result: 1
Result: 2
Result: 3Il do...while (e non un semplice while) è intenzionale: il primo result set è già corrente subito dopo mysqli_multi_query(), quindi bisogna elaborarlo prima di verificare se ce ne sono altri.
Insidie
- Abbinala sempre a
mysqli_next_result().mysqli_more_results()si limita a riportare lo stato; non sposta mai il puntatore. Chiamarla in un ciclo senzamysqli_next_result()produce un ciclo infinito sul primo set. - Libera ogni result set. Chiama
mysqli_free_result()prima di avanzare, altrimenti i result set extra rimangono in memoria. - Un'istruzione che non restituisce righe (un
INSERT,UPDATEo unSELECTvuoto) fa sì chemysqli_store_result()restituiscafalse— questo è normale, non un errore. Controllamysqli_errno($mysqli)se hai bisogno di distinguere i due casi.
Dimostrare il valore restituito senza un database
Non è necessario un server attivo per vedere cosa riporta la funzione. Riprodurre la logica con un piccolo array mostra chiaramente il ciclo e il valore booleano:
<?php
$resultSets = ["one", "two", "three"];
$index = 0;
do {
echo "Processing: {$resultSets[$index]}\n";
$index++;
// more_results() is true while another set remains.
$more = $index < count($resultSets);
echo $more ? "more_results -> true\n" : "more_results -> false\n";
} while ($more);
?>Output:
Processing: one
more_results -> true
Processing: two
more_results -> true
Processing: three
more_results -> falseFunzioni correlate
mysqli_multi_query()— esegue le istruzioni multiple.mysqli_next_result()— avanza al result set successivo.mysqli_use_result()— un'alternativa astore_result()che trasmette le righe in streaming.- Panoramica dell'estensione MySQLi — come tutte queste funzioni si integrano tra loro.
Conclusione
mysqli_more_results() è il controllo "ce n'è ancora?" nel ciclo multi-query. Da sola fa poco; combinata con mysqli_next_result() e mysqli_store_result() in un do...while, permette di elaborare in modo pulito ogni result set restituito da una singola chiamata a mysqli_multi_query().