mysqli_query în PHP

Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.

Sintaxă
mysqli_query(mysqli $mysql, string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

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ște mysqli_prepare.
  • Încerci să afișezi direct rezultatul: echo mysqli_query(...). Rezultatul este un obiect; rândurile se citesc cu mysqli_fetch_assoc.

Comenzi înrudite