PHP MySQL Select Where
Scopri come usare la clausola WHERE di MySQL in PHP per filtrare i risultati SELECT con operatori di confronto e istruzioni preparate PDO e MySQLi.
L'istruzione SELECT viene utilizzata per recuperare dati da un database. La clausola WHERE serve a filtrare i dati in base a condizioni specifiche. La clausola WHERE può essere combinata con l'istruzione SELECT per recuperare solo determinati dati dal database.
Di seguito è riportata la sintassi di base dell'istruzione SELECT con la clausola WHERE:
PHP / SQL sintassi di base dell'istruzione SELECT con la clausola WHERE
SELECT column1, column2, ...
FROM table_name
WHERE condition;Nella sintassi precedente:
column1,column2, ... sono le colonne da cui si vogliono recuperare i dati.table_nameè il nome della tabella da cui si vogliono recuperare i dati.conditionè un'espressione logica che determina quali dati recuperare.
Esempio
Considera una tabella denominata customers con i seguenti dati:
| id | name | country | |
|---|---|---|---|
| 1 | John | [email protected] | USA |
| 2 | Jane | [email protected] | UK |
| 3 | Alice | [email protected] | France |
Ecco un esempio di come utilizzare l'istruzione SELECT con la clausola WHERE per recuperare solo dati specifici dalla tabella customers:
PHP / SQL esempio di utilizzo dell'istruzione SELECT con la clausola WHERE per recuperare solo dati specifici dalla tabella customers
SELECT name, email
FROM customers
WHERE country = 'USA';L'istruzione SELECT precedente restituirà solo le righe in cui la colonna country è uguale a USA. L'output sarà:
name | email
----------|----------------------
John | [email protected]Condizioni Multiple
È possibile utilizzare più condizioni nella clausola WHERE. Ad esempio, si possono recuperare tutti i clienti dalla tabella customers che vivono negli USA e hanno un indirizzo email che termina con example.com.
PHP / SQL recupera tutti i clienti dalla tabella customers che vivono negli USA e hanno un indirizzo email che termina con example.com
SELECT name, email
FROM customers
WHERE country = 'USA'
AND email LIKE '%example.com';L'istruzione SELECT precedente restituirà il seguente output:
name | email
----------|----------------------
John | [email protected]È possibile utilizzare operatori logici come AND e OR per combinare più condizioni nella clausola WHERE. Quando si usano entrambi, racchiudi il gruppo OR tra parentesi affinché la precedenza sia quella attesa:
SELECT name, email
FROM customers
WHERE country = 'USA'
AND (name = 'John' OR name = 'Alice');Operatori di Confronto e Logici
La condition in una clausola WHERE è costruita tramite operatori. Questi sono quelli che utilizzerai più spesso:
| Operatore | Significato | Esempio |
|---|---|---|
= | Uguale a | country = 'USA' |
<> o != | Diverso da | country <> 'UK' |
>, <, >=, <= | Maggiore / minore di | id >= 2 |
BETWEEN | Nell'intervallo inclusivo | id BETWEEN 1 AND 3 |
IN | Corrisponde a un valore in un elenco | country IN ('USA', 'UK') |
LIKE | Corrispondenza a pattern (% = qualsiasi carattere, _ = un carattere) | email LIKE '%@example.com' |
IS NULL / IS NOT NULL | Verifica i valori mancanti | email IS NOT NULL |
AND, OR, NOT | Combina o nega le condizioni | country = 'USA' AND id > 1 |
Alcuni pattern comuni:
-- Match several values without writing OR three times
SELECT name FROM customers WHERE country IN ('USA', 'UK', 'France');
-- Inclusive numeric range
SELECT name FROM customers WHERE id BETWEEN 1 AND 2;
-- Find rows where a value is missing (do NOT use = NULL — that never matches)
SELECT name FROM customers WHERE email IS NULL;Eseguire una Query WHERE da PHP
Il titolo della pagina è "PHP MySQL", quindi ecco la parte che viene effettivamente eseguita in PHP. Poiché il valore di WHERE proviene quasi sempre dall'input dell'utente (un campo di ricerca, un parametro URL), non devi mai concatenarlo direttamente nella stringa SQL — questo aprirebbe la porta a iniezioni SQL. Utilizza invece un'istruzione preparata e associa il valore come parametro.
Esempio: filtraggio per paese con un'istruzione preparata PDO
<?php
$pdo = new PDO('mysql:host=localhost;dbname=shop;charset=utf8mb4', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// The user-supplied value never touches the SQL text directly.
$country = $_GET['country'] ?? 'USA';
$stmt = $pdo->prepare('SELECT name, email FROM customers WHERE country = ?');
$stmt->execute([$country]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
echo $row['name'] . ' - ' . $row['email'] . "\n";
}La stessa query con MySQLi si presenta così:
Esempio: la stessa query con MySQLi
<?php
$conn = new mysqli('localhost', 'user', 'password', 'shop');
$country = $_GET['country'] ?? 'USA';
$stmt = $conn->prepare('SELECT name, email FROM customers WHERE country = ?');
$stmt->bind_param('s', $country); // 's' = the parameter is a string
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['name'] . ' - ' . $row['email'] . "\n";
}Nota sulla sicurezza: Filtra sempre l'input fornito dall'utente tramite parametri associati (PDO o MySQLi), mai costruendo la stringa SQL con
"... WHERE country = '$country'". Le istruzioni preparate mantengono separati dati e codice, il che previene le iniezioni SQL.
Argomenti Correlati
- PHP MySQL Select — le basi di
SELECTsu cui si costruisce questa clausola. - PHP MySQL Order By — ordina le righe restituite dalla tua clausola
WHERE. - PHP MySQL Limit Data — limita il numero di righe filtrate restituite.
- PHP MySQL Prepared Statements — un approfondimento sul pattern sicuro utilizzato sopra.