mysqli_multi_query în PHP

Trimite mai multe comenzi SQL odată, separate prin punct și virgulă.

Sintaxă
mysqli_multi_query(mysqli $mysql, string $query): bool

Ce face mysqli_multi_query

mysqli_query acceptă o singură comandă. mysqli_multi_query trimite mai multe dintr-o dată, de exemplu un fișier de instalare. Fiecare comandă produce un rezultat, pe care îl iei cu mysqli_store_result și treci la următorul cu mysqli_next_result, cât timp mysqli_more_results este adevărat.

Pentru că permite mai multe comenzi, este periculoasă cu date de la utilizator: un atac SQL injection poate adăuga o comandă întreagă (; DROP TABLE ...). Folosește-o doar cu SQL scris de tine.

Exemplele de pe această pagină folosesc baza de date magazin, cu tabelul produse (coloanele id INT AUTO_INCREMENT, nume VARCHAR(100) NOT NULL, pret INT și stoc INT) și patru rânduri: Laptop (3200 lei, 5 buc.), Mouse (80 lei, 40 buc.), Monitor (900 lei, 0 buc.) și Tastatură (150 lei, 12 buc.). Comenzile SQL sunt explicate în secțiunea MySQL. Rezultatele au fost scrise pentru MySQL 8, pentru că exemplele au nevoie de un server de baze de date.

Parametri

Parametru Descriere
$mysql Conexiunea.
$query Comenzile SQL, separate prin ;.

Ce returnează

true dacă prima comandă a reușit. Erorile din comenzile următoare apar la mysqli_next_result.

Exemple

Exemplul 1: Trei interogări, trei rezultate

<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");

mysqli_multi_query($conn, "SELECT COUNT(*) FROM produse; SELECT MAX(pret) FROM produse; SELECT SUM(stoc) FROM produse");

do {
    if ($rezultat = mysqli_store_result($conn)) {
        echo mysqli_fetch_row($rezultat)[0] . "\n";
        mysqli_free_result($rezultat);
    }
} while (mysqli_more_results($conn) && mysqli_next_result($conn));

Rezultat (cu un server MySQL și tabelul produse de mai sus)

4
3200
57

Greșeli frecvente

  • Nu parcurgi toate rezultatele. Următorul mysqli_query pe aceeași conexiune dă Commands out of sync; you can't run this command now.

Comenzi înrudite

  • mysqli_more_results: Verifică dacă, după mysqli_multi_query, mai urmează rezultate de citit.
  • mysqli_next_result: Trece la următorul rezultat al unui mysqli_multi_query, ca să îl poți citi.
  • mysqli_store_result: Aduce în memorie tot rezultatul ultimei interogări trimise cu mysqli_real_query sau mysqli_multi_query.
  • mysqli_query: Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.