Bases de données PDF Gratuit

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 objet PDO avec gestion d'erreur via try/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() et query(), critères de choix selon volume et consommation mémoire et utilisation des PDOStatement.
  • Sécuriser les interactions SQL — usage de paramètres nommés et liaisons via bindValue/bindParam pour 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() et rollBack() pour regrouper des opérations dépendantes et restaurer l'état en cas d'erreur.
  • Optimiser le parcours des résultats — choix entre fetch() et fetchAll(), 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,
]);
Connexions MySQL et SQLite : options recommandées pour production et tests.

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
}
Exemple complet : transaction entourée de 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 un PDOStatement pour itération via fetch() ou fetchAll().

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.

Comparatif des modes de récupération
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);
?>
Préparer, exécuter et récupérer en mode associatif.

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() et query() ?
exec() exécute des commandes ne retournant pas de jeu de résultats et renvoie le nombre de lignes affectées. query() renvoie un PDOStatement que l'on parcourt via fetch() ou fetchAll(). Le choix dépend de la nature de l'opération et de la contrainte mémoire.
Quand utiliser bindParam plutôt que bindValue ?
bindParam lie une variable par référence et est utile si la valeur sera modifiée avant execute(). bindValue copie la valeur au moment de la liaison ; pour la plupart des cas statiques, bindValue est 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.