mysqli_fetch_assoc / mysqli_fetch_all / mysqli_fetch_array în PHP

Baze de date (mysqli și PDO) PHP 5+ (mysqli_fetch_all: PHP 5.3+)

Citește următorul rând dintr-un rezultat, ca tablou cu numele coloanelor drept chei.

Sintaxă
mysqli_fetch_assoc(mysqli_result $result): array|false|null

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"] === 0 este mereu false, pentru că valoarea este textul "0". Convertește cu (int) sau folosește interogări pregătite.
  • Apelezi mysqli_fetch_all fără MYSQLI_ASSOC și apoi cauți $rand["nume"]. Cheile sunt 0, 1, 2… și primești Undefined array key.
  • Folosești mysqli_fetch_all pe tabele cu sute de mii de rânduri. Încarci totul în memorie; citește rând cu rând cu while.

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.