Ce face mysqli_query
mysqli_query rulează o comandă SQL pe conexiunea dată. Pentru SELECT, SHOW sau DESCRIBE returnează un obiect mysqli_result, din care citești rândurile cu mysqli_fetch_assoc. Pentru INSERT, UPDATE, DELETE returnează true.
Folosește mysqli_query doar pentru interogări fără date venite de la utilizator. Dacă interogarea conține valori din formular, URL sau cookie-uri, folosește mysqli_prepare, ca să eviți atacurile de tip SQL injection.
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 returnată de mysqli_connect. |
$query |
Comanda SQL. |
$result_mode |
Opțional. MYSQLI_STORE_RESULT (implicit) încarcă tot rezultatul în memorie; MYSQLI_USE_RESULT citește rândurile pe rând de pe server. |
Ce returnează
Un mysqli_result pentru interogările care întorc rânduri, true pentru celelalte. Din PHP 8.1, la eroare aruncă mysqli_sql_exception.
Exemple
Exemplul 1: Citirea rândurilor dintr-un SELECT
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");
$rezultat = mysqli_query($conn, "SELECT nume, pret FROM produse WHERE stoc > 0 ORDER BY pret");
while ($rand = mysqli_fetch_assoc($rezultat)) {
echo $rand["nume"] . ": " . $rand["pret"] . " lei\n";
}
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Mouse: 80 lei
Tastatură: 150 lei
Laptop: 3200 lei
Exemplul 2: Comenzi care modifică datele
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
$ok = mysqli_query($conn, "UPDATE produse SET stoc = stoc + 10 WHERE stoc = 0");
var_dump($ok);
echo "Rânduri modificate: " . mysqli_affected_rows($conn);
Rezultat (cu un server MySQL și tabelul produse de mai sus)
bool(true)
Rânduri modificate: 1
Exemplul 3: Interogarea poate fi parcursă direct cu foreach
Din PHP 5.4, un mysqli_result se poate parcurge cu foreach; fiecare rând este un tablou asociativ.
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");
foreach (mysqli_query($conn, "SELECT id, nume FROM produse ORDER BY id") as $rand) {
echo "#{$rand['id']} {$rand['nume']}\n";
}
Rezultat (cu un server MySQL și tabelul produse de mai sus)
#1 Laptop
#2 Mouse
#3 Monitor
#4 Tastatură
Greșeli frecvente
- Lipești în SQL valori venite de la utilizator:
"SELECT * FROM produse WHERE id = " . $_GET["id"]. Oricine poate modifica interogarea (SQL injection). Foloseștemysqli_prepare. - Încerci să afișezi direct rezultatul:
echo mysqli_query(...). Rezultatul este un obiect; rândurile se citesc cumysqli_fetch_assoc.
Comenzi înrudite
mysqli_prepare: Pregătește o interogare SQL cu semne ? în loc de valori. Este metoda sigură împotriva SQL injection.mysqli_fetch_assoc / mysqli_fetch_all / mysqli_fetch_array: Citește următorul rând dintr-un rezultat, ca tablou cu numele coloanelor drept chei.mysqli_num_rows: Returnează numărul de rânduri dintr-un rezultat SELECT.mysqli_affected_rows: Returnează câte rânduri au fost modificate de ultimul INSERT, UPDATE, DELETE sau REPLACE.mysqli_error: Returnează mesajul de eroare al ultimei operații MySQL de pe conexiune, sau text gol dacă nu a fost eroare.