Semaine 3 - Jour 2 : PDO et Connexion à MySQL

Introduction à PDO

PDO (PHP Data Objects) est une interface légère pour accéder aux bases de données en PHP. Il supporte plusieurs systèmes de gestion de bases de données (MySQL, PostgreSQL, SQLite...) et utilise des requêtes préparées pour protéger contre les injections SQL.

Dans ce cours, nous allons apprendre à nous connecter à une base de données MySQL de manière sécurisée, à comprendre la différence entre PDO et mysqli, et à maîtriser les requêtes préparées pour manipuler les données en toute sécurité.

1. PDO vs mysqli

Pourquoi choisir PDO ?

// PDO (PHP Data Objects)
✅ Supporte plusieurs SGBD
✅ Syntaxe orientée objet claire
✅ Requêtes préparées natives
✅ Gestion d'erreurs avec exceptions
✅ Plus moderne et recommandé

// mysqli
❌ Uniquement pour MySQL
⚠️ Syntaxe procédurale ou objet
✅ Requêtes préparées disponibles
⚠️ Gestion d'erreurs basique
⚠️ Plus ancien
Recommandation : Utilisez PDO pour tous vos nouveaux projets. Il offre plus de flexibilité et une meilleure sécurité.

2. Connexion sécurisée avec PDO

Exemple de connexion basique

// config.php - Fichier de configuration
<?php
$host = 'localhost';
$dbname = 'mon_site';
$username = 'root';
$password = '';

try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $username,
        $password
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connexion réussie !";
} catch (PDOException $e) {
    die("Erreur : " . $e->getMessage());
}
?>
Résultat : Connexion réussie !

3. Requêtes préparées

Protection contre les injections SQL

<?php
// ❌ DANGEREUX : Vulnérable aux injections
$email = $_POST['email'];
$query = "SELECT * FROM users WHERE email = '$email'";

// ✅ SÉCURISÉ : Requête préparée
$email = $_POST['email'];
$query = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($query);
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
?>
Important : Les requêtes préparées empêchent les hackers d'injecter du code SQL malveillant dans vos requêtes.

4. Les 3 étapes d'une requête préparée

PREPARE → EXECUTE → FETCH

<?php
// 1. PREPARE : Préparer la requête
$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE id = :id"
);

// 2. EXECUTE : Exécuter avec les valeurs
$stmt->execute(['id' => $id]);

// 3. FETCH : Récupérer le résultat
$user = $stmt->fetch();
?>
Méthodes de récupération :
fetch() : Une seule ligne
fetchAll() : Toutes les lignes
fetchColumn() : Une seule colonne
Froggiesplaining :


Objectifs de ce cours :
✅ Comprendre PDO vs mysqli
✅ Se connecter à MySQL de manière sécurisée
✅ Maîtriser les requêtes préparées
✅ Protéger contre les injections SQL
✅ Gérer les erreurs avec try/catch

Points clés à retenir :
• PDO supporte plusieurs bases de données (MySQL, PostgreSQL, SQLite...)
• Les requêtes préparées protègent contre les injections SQL
• TOUJOURS utiliser charset=utf8mb4 pour les caractères spéciaux
• Activer ERRMODE_EXCEPTION pour détecter les erreurs
• Utiliser htmlspecialchars() avant d'afficher des données
• Ne JAMAIS afficher les messages d'erreur détaillés en production

Exercice pratique :
1. Créez une connexion PDO à votre base de données
2. Créez une table "users" avec id, nom, email
3. Insérez 3 utilisateurs avec des requêtes préparées
4. Affichez tous les utilisateurs avec fetchAll()
5. Recherchez un utilisateur par email avec fetch()
6. Gérez les erreurs avec try/catch

Froggie explain

GitHub - eCrea