W3docs

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): bool

Nello stile orientato agli oggetti lo stesso metodo è $mysqli->more_results().

Parametro

  • $mysql — un oggetto di connessione MySQLi restituito da mysqli_connect() (o new 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:

FunzioneRuolo
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: 3

Il 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 senza mysqli_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, UPDATE o un SELECT vuoto) fa sì che mysqli_store_result() restituisca false — questo è normale, non un errore. Controlla mysqli_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 -> false

Funzioni correlate

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().

Pratica

Pratica
Cosa fa mysqli_more_results() in PHP?
Cosa fa mysqli_more_results() in PHP?
Was this page helpful?