Cours PHP PDO en PDF (Avancé)
Cours PHP PDO en PDF (Avancé)
PHP avancé — Gérer une base de données avec PDO : éléments essentiels. PDO (PHP Data Objects) est une extension orientée objet fournie avec PHP qui unifie l'accès aux SGBD via un DSN et des pilotes distincts, offrant des méthodes pour la connexion, l'exécution de requêtes et la gestion des erreurs. Maîtriser PDO réduit les risques d'injection SQL, facilite l'utilisation de requêtes préparées et permet de gérer des transactions atomiques sur des moteurs compatibles. Document produit par BGE, organisme de formation axé sur la pratique et la rigueur technique.
Objectifs d'apprentissage
- Établir une connexion robuste — composition d'un
DSN(host, dbname, port, unix_socket) et instanciation d'un objetPDOavec gestion d'erreur viatry/catch. Création d'un fichier de connexion réutilisable pour centraliser les paramètres et réduire les risques en production. - Exécuter et interpréter les requêtes — différence entre
exec()etquery(), critères de choix selon volume et consommation mémoire et utilisation desPDOStatement. - Sécuriser les interactions SQL — usage de paramètres nommés et liaisons via
bindValue/bindParampour prévenir les injections; attention aux implications de la liaison par valeur ou par référence. - Implémenter des transactions atomiques — maîtrise de
beginTransaction(),commit()etrollBack()pour regrouper des opérations dépendantes et restaurer l'état en cas d'erreur. - Optimiser le parcours des résultats — choix entre
fetch()etfetchAll(), modes de récupération et stratégies pour traitements batch.
📑 Sommaire du document
- 1. Introduction à PDO
- 2. Configuration et DSN
- 3. Requêtes préparées
- 4. Gestion des transactions
- 5. Traitement des erreurs
🎯 Points clés
- Connexion centralisée et sécurisée via un fichier de configuration.
- Requêtes préparées et liaisons pour neutraliser les vecteurs d'injection.
- Transactions encadrées par gestion d'exceptions pour assurer l'intégrité.
- Choix de modes de récupération en fonction de la mémoire et de la lisibilité.
Exemple de configuration DSN
Exemples de connexions pour MySQL et SQLite. Adapter les options (charset, attributes) selon l'usage et l'environnement.
// MySQL
$dsn = 'mysql:host=127.0.0.1;dbname=ma_base;charset=utf8mb4;port=3306';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_PERSISTENT => false,
];
$pdo = new PDO($dsn, $dbUser, $dbPass, $options);
// SQLite (fichier)
$dsnSqlite = 'sqlite:/path/to/database.sqlite';
$pdoSqlite = new PDO($dsnSqlite, null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
Gestion des exceptions et erreurs PDO
Activer PDO::ERRMODE_EXCEPTION permet de centraliser le traitement des erreurs via des blocs try/catch. Structurer la gestion d'exception pour journaliser l'erreur et renvoyer une réponse contrôlée sans divulguer d'informations sensibles.
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare('UPDATE accounts SET balance = balance - :amt WHERE id = :id');
$stmt->execute([':amt' => $amount, ':id' => $fromAccount]);
$stmt = $pdo->prepare('UPDATE accounts SET balance = balance + :amt WHERE id = :id');
$stmt->execute([':amt' => $amount, ':id' => $toAccount]);
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollBack();
// Logging sécurisé (ex. fichier, service de monitoring) ; remonter un message non détaillé vers l'UI
error_log('Transaction failed: ' . $e->getMessage());
throw $e; // ou gérer selon la politique d'erreur de l'application
}
try/catch avec rollback et logging.Bonnes pratiques de sécurité avec PDO
Limiter les droits de l'utilisateur de la base (principe du moindre privilège), valider et normaliser les entrées, utiliser des requêtes préparées et éviter la concaténation de chaînes pour construire des requêtes. Centraliser l'accès aux identifiants et stocker les secrets hors du code source. Ces mesures s'intègrent dans un tutoriel PHP PDO MySQL visant à réduire les vecteurs d'attaque et faciliter les audits de sécurité.
Exécuter et interpréter les requêtes
exec(): usage pour INSERT/UPDATE/DELETE sans jeu de résultats ; renvoie le nombre de lignes affectées.query(): exécute une requête et retourne unPDOStatementpour itération viafetch()oufetchAll().
Modes de récupération PDO détaillés
Les modes de récupération influent sur l'empreinte mémoire et la lisibilité du code. Choisir le mode adapté selon le volume de données et la forme de traitement souhaitée.
Comparatif pratique : dans des boucles traitant des milliers de lignes, PDO::FETCH_NUM peut réduire l'empreinte mémoire et accélérer légèrement les itérations car il évite la création d'associations clé/valeur ; PDO::FETCH_ASSOC favorise la lisibilité et réduit la duplication des clés par rapport à des modes combinés. Pour des traitements massifs, privilégier des parcours en streaming (fetch() en boucle) et éviter fetchAll() lorsque la mémoire est contrainte. Ce point est essentiel dans tout tutoriel PHP PDO MySQL ou toute documentation sur les requêtes préparées PHP et la gestion erreurs PDO.
| Mode | Structure renvoyée | Avantages | Inconvénients |
|---|---|---|---|
| PDO::FETCH_ASSOC | Tableau associatif | Accès par nom, bonne lisibilité, économie mémoire vs FETCH_BOTH | Pas d'accès via index numérique |
| PDO::FETCH_NUM | Tableau indexé numériquement | Compact et performant pour boucles serrées | Moins lisible sans documentation des colonnes |
| PDO::FETCH_OBJ | Objet anonyme | Accès par propriété, pratique pour mapping léger | Création d'objets pour chaque ligne (coût mémoire) |
Exemple pratique : Requête préparée
Préparation, exécution et récupération en mode associatif pour minimiser les risques d'injection et faciliter l'exploitation des colonnes.
prepare('SELECT id, username, email FROM users WHERE id = :id');
$stmt->execute([':id' => $userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>
Architecture : Utiliser PDO avec un Singleton
Un accès centralisé à PDO (pattern Singleton ou gestion via conteneur d'injection de dépendances) limite les instanciations multiples, facilite le logging centralisé et rend plus simple la mise en place d'une politique de gestion d'erreurs et de transactions. Documenter et centraliser la configuration aide aux tests et aux revues de sécurité.
❓ Foire Aux Questions (FAQ)
- Quelle est la différence opérationnelle entre
exec()etquery()? exec()exécute des commandes ne retournant pas de jeu de résultats et renvoie le nombre de lignes affectées.query()renvoie unPDOStatementque l'on parcourt viafetch()oufetchAll(). Le choix dépend de la nature de l'opération et de la contrainte mémoire.- Quand utiliser
bindParamplutôt quebindValue? bindParamlie une variable par référence et est utile si la valeur sera modifiée avantexecute().bindValuecopie la valeur au moment de la liaison ; pour la plupart des cas statiques,bindValueest plus simple et évite les effets de bord liés aux références. Pour approfondir ces concepts, consultez notre Cours Le langage SQL en PDF (Intermédiaire) ou explorez les bases de données modèles et langages.