WHERE, ORDER BY et LIMIT
WHERE : filtrer les résultats
WHERE filtre les résultats. Seules les lignes qui correspondent à la condition sont retournées.
-- Utilisateurs de plus de 25 ans
SELECT * FROM utilisateurs WHERE age > 25;
-- Utilisateur avec un email spécifique
SELECT * FROM utilisateurs WHERE email = 'alice@ex.com';
-- Plusieurs conditions
SELECT * FROM utilisateurs
WHERE age > 18 AND age < 30;
Les requêtes préparées : INDISPENSABLE
Quand une valeur vient d'un formulaire ou d'une URL, ne l'insère jamais directement dans la requête SQL. C'est la porte ouverte aux injections SQL. Une injection SQL, c'est quand un attaquant modifie ta requête pour accéder à des données qu'il ne devrait pas voir.
JAMAIS ça : $pdo->query("SELECT * FROM users WHERE id = " . $_GET['id'])
Si $_GET['id'] vaut 1 OR 1=1, la requête retourne tous les utilisateurs. Bien pire est possible.
La solution : les requêtes préparées. La requête et les valeurs sont séparées. PDO les assemble de façon sécurisée.
// Bonne pratique : requête préparée avec paramètre
$age_min = $_GET['age'] ?? 18; // valeur venant de l'URL
$stmt = $pdo->prepare(
"SELECT * FROM utilisateurs WHERE age > :age"
);
$stmt->execute([':age' => $age_min]);
$resultats = $stmt->fetchAll(PDO::FETCH_ASSOC);
:age est un paramètre nommé. C'est un espace réservé. PDO met la vraie valeur à sa place, de façon sécurisée. Aucune injection possible.
ORDER BY : trier les résultats
-- Trier par âge croissant
SELECT * FROM utilisateurs ORDER BY age ASC;
-- Trier par nom décroissant (Z→A)
SELECT * FROM utilisateurs ORDER BY nom DESC;
-- Combiné : filtrer ET trier
SELECT * FROM utilisateurs
WHERE age > 20
ORDER BY nom ASC;
LIMIT : limiter le nombre de résultats
-- Les 10 premiers résultats
SELECT * FROM utilisateurs LIMIT 10;
-- Pagination : page 2 (10 résultats par page, sauter les 10 premiers)
SELECT * FROM utilisateurs LIMIT 10 OFFSET 10;
Exemple complet : recherche par nom
require_once 'connexion.php';
$recherche = $_GET['q'] ?? '';
$stmt = $pdo->prepare(
"SELECT * FROM utilisateurs
WHERE nom LIKE :recherche
ORDER BY nom ASC
LIMIT 20"
);
$stmt->execute([':recherche' => '%' . $recherche . '%']);
$resultats = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<form>
<input name="q" value="<?= htmlspecialchars($recherche) ?>"/>
<button>Rechercher</button>
</form>
<?php foreach ($resultats as $u): ?>
<p><?= htmlspecialchars($u['nom']) ?></p>
<?php endforeach; ?>
LIKE '%texte%' cherche dans toute la colonne. Le % veut dire "n'importe quoi". Utile pour une barre de recherche.
WHERE colonne = valeur— filtrer les résultats- Requêtes préparées =
prepare()+execute()avec paramètres — protection anti-injection - Jamais concaténer une variable directement dans une requête SQL
ORDER BY colonne ASC/DESC— trier les résultatsLIMIT n— limiter le nombre de résultatsLIKE '%texte%'— recherche partielle dans un champ texte