Leçon 4 / 8
Leçon 04 · Partie 1 — Bases de données

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.

// À retenir
  • 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ésultats
  • LIMIT n — limiter le nombre de résultats
  • LIKE '%texte%' — recherche partielle dans un champ texte