PHP + MySQL — PDO et requêtes préparées
Connexion PDO, requêtes préparées et protection injection SQL
Concepts Théoriques
PDO (PHP Data Objects) est la méthode standard pour se connecter à une base de données en PHP. C'est une interface orientée objet qui fonctionne avec MySQL, PostgreSQL, SQLite, et d'autres.
Connexion avec PDO
La connexion se fait en créant un objet PDO avec le DSN (Data Source Name), le nom d'utilisateur et le mot de passe. Mettez cette connexion dans config/database.php et incluez-le dans chaque page.
Options recommandées :
- ERRMODE_EXCEPTION — lève une exception en cas d'erreur SQL (au lieu de retourner silencieusement false)
- FETCH_ASSOC — retourne les résultats en tableaux associatifs (par défaut)
- CHARSET utf8mb4 — supporte les accents et les emojis
Requêtes préparées — OBLIGATOIRE
JAMAIS de concaténation de variables dans une requête SQL. C'est la porte ouverte à l'injection SQL — l'attaque la plus dangereuse :
Mauvais : "SELECT * FROM users WHERE email = '$email'" — un attaquant peut injecter du SQL via $email.
Bon : $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]); — la valeur est traitée comme une donnée, jamais comme du SQL.
Les requêtes préparées séparent le SQL des données. La base de données ne peut JAMAIS confondre une valeur avec une commande SQL.
Modes de fetch
- fetch() — retourne UNE seule ligne (ou false)
- fetchAll() — retourne TOUTES les lignes dans un tableau
- FETCH_ASSOC — tableau associatif : $row['title']
- FETCH_OBJ — objet : $row->title
> Règle absolue : Utilisez TOUJOURS des requêtes préparées. TOUJOURS. Même si la donnée vient de votre propre code. C'est une habitude qui doit devenir un réflexe.