PHP MySQL Select: Guida Completa
Impara a usare SQL SELECT in PHP — filtra con WHERE, ordina con ORDER BY, pagina con LIMIT e recupera righe con mysqli e PDO.
SELECT è l'istruzione SQL che legge i dati da un database — è quella che userai più di qualsiasi altra. Questa guida tratta la sintassi di SELECT, le clausole che plasmano i tuoi risultati, e le due estensioni PHP (mysqli e PDO) che usi per eseguire una query e scorrere le righe che restituisce.
Se non hai ancora effettuato la connessione a un database, inizia con PHP MySQL Connect; per inserire righe in una tabella prima, vedi PHP MySQL Insert.
Cosa fa l'istruzione SELECT
SELECT recupera righe da una o più tabelle. Nella forma più semplice, indichi le colonne che vuoi e la tabella da cui leggerle:
SELECT column1, column2, ...
FROM table_name;Usa * per selezionare tutte le colonne. È comodo per un'esplorazione rapida, ma dovresti nominare le colonne esplicitamente nel codice applicativo — è più veloce, rende le tue intenzioni chiare e il tuo codice non si romperà quando qualcuno aggiunge una colonna alla tabella.
-- All columns (fine for the mysql console, avoid in app code)
SELECT * FROM users;
-- Only what you need (preferred)
SELECT id, name, email FROM users;Un SELECT restituisce sempre un result set: zero o più righe, ciascuna composta dalle colonne richieste. PHP ti fornisce quel result set come qualcosa su cui puoi iterare.
Modellare il Result Set
La forma colonne-e-tabella è solo l'inizio. Cinque clausole permettono di filtrare, ordinare, raggruppare e combinare i dati. Devono apparire in questo ordine quando ne usi più di una:
| Clausola | Cosa fa | Approfondimento |
|---|---|---|
WHERE | Conserva solo le righe che soddisfano una condizione | MySQL WHERE |
GROUP BY | Raggruppa le righe per aggregati come COUNT() | — |
HAVING | Filtra quei gruppi (come WHERE, ma per gli aggregati) | — |
ORDER BY | Ordina le righe | MySQL ORDER BY |
LIMIT | Limita il numero di righe restituite | MySQL LIMIT |
Filtrare con WHERE
Restituisce solo gli utenti di nome John:
SELECT name, email
FROM users
WHERE name = 'John';Ordinare con ORDER BY
Ordina alfabeticamente per nome. ASC è crescente (il default), DESC è decrescente:
SELECT name, email
FROM users
ORDER BY name ASC;Limitare le righe con LIMIT
Prendi solo i 10 utenti più recenti — essenziale per la paginazione e per non caricare milioni di righe in memoria:
SELECT name, email
FROM users
ORDER BY created_at DESC
LIMIT 10;Unire tabelle
JOIN collega tabelle correlate su una chiave condivisa. Qui ogni ordine viene abbinato all'utente che lo ha effettuato:
SELECT users.name, orders.order_id
FROM users
JOIN orders ON users.id = orders.user_id;Eseguire un SELECT da PHP
Per ottenere i dati nel tuo codice PHP, il flusso è sempre lo stesso:
- Connettiti al database.
- Esegui l'istruzione
SELECT. - Recupera le righe dal result set.
- Chiudi la connessione (PHP la chiude anche automaticamente alla fine della richiesta).
Usa sempre le prepared statement per l'input dell'utente
Non inserire mai una variabile direttamente in una stringa di query. Se $name proviene da un form, un attaccante può iniettare SQL e leggere o distruggere l'intero database:
// DANGER: SQL injection. Never do this with untrusted input.
$result = $conn->query("SELECT name, email FROM users WHERE name = '$name'");Una prepared statement invia la query e i dati separatamente, in modo che il valore non possa mai essere interpretato come SQL. Questa è la singola abitudine più importante quando si leggono dati forniti dall'utente. Vedi MySQL Prepared Statements per maggiori informazioni.
Con mysqli
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$stmt = $conn->prepare("SELECT name, email FROM users WHERE name = ?");
$name = "John";
$stmt->bind_param("s", $name); // "s" = the parameter is a string
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "0 results";
}
$stmt->close();
mysqli_close($conn);fetch_assoc() restituisce ogni riga come un array associativo indicizzato per nome di colonna ($row["name"]). Usa fetch_array() se vuoi anche le chiavi numeriche, oppure fetch_all(MYSQLI_ASSOC) per recuperare tutte le righe in un colpo solo in un array.
Con PDO
Per i nuovi progetti, PDO è generalmente la scelta migliore: ha un'API coerente su MySQL, PostgreSQL, SQLite e altri, e le sue prepared statement sono facili da leggere.
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8mb4", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE name = ?");
$stmt->execute(["John"]);
foreach ($stmt as $row) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}Impostare PDO::ERRMODE_EXCEPTION fa sì che le query fallite lancino eccezioni invece di fallire silenziosamente — racchiudi le chiamate al database in try/catch in modo che i problemi emergano invece di scomparire.
Errori Comuni
num_rowsrestituisce righe, non un boolean. Controlla> 0(mysqli) prima di assumere di aver ricevuto dati.- Selezionare
*e poi leggere una sola colonna trasferisce comunque tutte le colonne sulla rete. Seleziona solo ciò che usi. - Dimenticare
LIMITsu tabelle grandi può caricare enormi result set in memoria. Usa la paginazione. - Il confronto di stringhe in
WHEREnon fa distinzione tra maiuscole e minuscole per default nelle collation comuni di MySQL —'john'corrisponde a'John'.
Conclusione
SELECT è il motore di ogni applicazione PHP/MySQL. Nomina le colonne esplicitamente, modella i risultati con WHERE, ORDER BY, LIMIT e JOIN, e usa sempre le prepared statement (mysqli o PDO) per leggere l'input dell'utente e rimanere al sicuro dagli attacchi di SQL injection. Da qui, impara a modificare i dati con MySQL Insert e MySQL Update.