Ce face mysqli_fetch_assoc / mysqli_fetch_all / mysqli_fetch_array
mysqli_fetch_assoc returnează rândul următor ca tablou asociativ (["nume" => "Mouse", ...]) sau null când nu mai sunt rânduri. De aceea se folosește aproape mereu într-un while.
mysqli_fetch_all($rezultat, MYSQLI_ASSOC) returnează dintr-o dată toate rândurile, într-un tablou de tablouri. Atenție: fără al doilea parametru, cheile sunt numerice (MYSQLI_NUM). mysqli_fetch_array dă implicit ambele tipuri de chei (MYSQLI_BOTH), iar mysqli_fetch_row doar chei numerice.
La interogările obișnuite (mysqli_query), toate valorile vin ca text, chiar și numerele; NULL din baza de date devine null. La interogările pregătite, numerele vin ca int sau float.
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 |
|---|---|
$result |
Rezultatul returnat de mysqli_query sau mysqli_stmt_get_result. |
Ce returnează
Un tablou asociativ cu rândul curent, null dacă nu mai sunt rânduri sau false la eroare.
Exemple
Exemplul 1: Rând cu rând, cu while
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");
$rezultat = mysqli_query($conn, "SELECT nume, stoc FROM produse ORDER BY nume");
while ($rand = mysqli_fetch_assoc($rezultat)) {
$stare = $rand["stoc"] > 0 ? "în stoc" : "epuizat";
echo "{$rand['nume']}: $stare\n";
}
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Laptop: în stoc
Monitor: epuizat
Mouse: în stoc
Tastatură: în stoc
Exemplul 2: Valorile vin ca text
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
$rand = mysqli_fetch_assoc(mysqli_query($conn, "SELECT id, pret FROM produse WHERE id = 2"));
var_dump($rand);
var_dump((int) $rand["pret"] === 80);
Rezultat (cu un server MySQL și tabelul produse de mai sus)
array(2) {
["id"]=>
string(1) "2"
["pret"]=>
string(2) "80"
}
bool(true)
Exemplul 3: Toate rândurile deodată și fetch_array
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");
$toate = mysqli_fetch_all(mysqli_query($conn, "SELECT nume, pret FROM produse WHERE pret < 200 ORDER BY id"), MYSQLI_ASSOC);
print_r($toate);
$rand = mysqli_fetch_array(mysqli_query($conn, "SELECT nume FROM produse WHERE id = 1"));
print_r($rand);
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Array
(
[0] => Array
(
[nume] => Mouse
[pret] => 80
)
[1] => Array
(
[nume] => Tastatură
[pret] => 150
)
)
Array
(
[0] => Laptop
[nume] => Laptop
)
Greșeli frecvente
- Compari valoarea cu un număr folosind
===:$rand["stoc"] === 0este mereufalse, pentru că valoarea este textul"0". Convertește cu(int)sau folosește interogări pregătite. - Apelezi
mysqli_fetch_allfărăMYSQLI_ASSOCși apoi cauți$rand["nume"]. Cheile sunt 0, 1, 2… și primeștiUndefined array key. - Folosești
mysqli_fetch_allpe tabele cu sute de mii de rânduri. Încarci totul în memorie; citește rând cu rând cuwhile.
Comenzi înrudite
mysqli_query: Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.mysqli_prepare: Pregătește o interogare SQL cu semne ? în loc de valori. Este metoda sigură împotriva SQL injection.mysqli_num_rows: Returnează numărul de rânduri dintr-un rezultat SELECT.foreach: Parcurge, pe rând, fiecare element dintr-un tablou.