Par Valentin Brosseau / @c4software
Jusqu'ici, vous conceviez vos bases. Aujourd'hui, je vous en fournis une.
C'est la situation la plus courante en entreprise : le projet existe déjà.
Quatre tables, aucune documentation. Question : que regarde-t-on en premier ?
Les clés étrangères. emprunts.livre_id et emprunts.adherent_id vous disent qu'un emprunt relie un livre et un adhérent. Le reste, ce sont des détails.
Il n'y a aucune colonne disponible dans la table livres.
Question : comment répond-on, alors ?
SELECT * FROM emprunts
WHERE livre_id = ? AND date_retour IS NULL;Aucun résultat, le livre est disponible.
L'information n'est pas stockée, elle se déduit.
Afficher le titre et le nom de l'emprunteur : une requête avec JOIN, ou deux requêtes simples ?
Les deux sont valables. Élégance d'un côté, lisibilité de l'autre.
Sachez justifier votre choix.
SELECT categories.nom, COUNT(livres.id) AS nb
FROM categories
LEFT JOIN livres ON livres.categorie_id = categories.id
GROUP BY categories.id;GROUP BY fait les paquets, COUNT() compte dedans.
Question : avec un JOIN classique, qui disparait de la liste ?
Une catégorie sans livre, un adhérent sans emprunt : ils sortent du résultat.
LEFT JOIN garde toute la table de gauche, et COUNT() renvoie 0.
Dans 90% des cas, c'est un LEFT JOIN que vous cherchez.
Une valeur qui vient de l'utilisateur ($_GET, $_POST) ne se concatène jamais.
$stmt = $pdo->prepare("SELECT * FROM livres WHERE id = ?");
$stmt->execute([$_GET['id']]);C'est le critère bloquant du TP.
Emprunter : INSERT. Rendre : UPDATE de date_retour. Retirer un livre : DELETE. Et le WHERE n'est jamais optionnel.
Supprimer un livre déjà emprunté ? MySQL refuse : la clé étrangère protège vos données.
Question : interdire, supprimer en cascade, ou ne pas proposer le bouton ?
En séance : explorer la base, les catégories, les livres, la fiche, la recherche.
À la maison : les adhérents, l'emprunt, le retour, l'ajout, la suppression.
En autonomie : protéger les pages qui modifient la base.
LEFT JOIN + GROUP BY + COUNT() pour les compteurs.Place au TP 🚀