Leçon 7 / 15

Configurer la connexion PDO

20 min PHP 8 — structurer une application (PDO, POO, sessions) Gratuit

Objectif : Établir une connexion PDO centralisée et gérer les erreurs de connexion.

Une application ne doit pas disperser les paramètres MySQL dans ses pages ou ses classes métier. Si la connexion échoue, vous devez aussi obtenir une erreur exploitable plutôt qu’un comportement silencieux ou difficile à diagnostiquer. Vous allez placer la configuration PDO dans un fichier dédié et fournir au dépôt une connexion déjà créée.

Définir la configuration de connexion

Dans la leçon « Délimiter les responsabilités des classes », vous avez préparé `ContactDepot` pour recevoir un objet `PDO` par son constructeur. La classe `BaseDeDonnees` va prendre en charge la création de cet objet : elle ne listera pas les contacts et ne contiendra aucune règle métier. Cette séparation permet de modifier les paramètres de connexion sans réécrire le dépôt.

Pour MySQL, PDO reçoit un DSN, c’est-à-dire une chaîne qui précise le pilote et les paramètres de connexion. Vous y indiquerez le serveur, le nom de la base et l’encodage `utf8mb4`, adapté aux caractères Unicode. Le nom d’utilisateur et le mot de passe sont fournis séparément au constructeur de `PDO`.

Créer la connexion centralisée

Ajoutez le code suivant à `src/Configuration/BaseDeDonnees.php`. La méthode `creer()` lit les paramètres définis dans l’environnement, construit le DSN, puis renvoie une connexion typée `PDO`. Si les informations indispensables manquent, elle signale immédiatement une erreur de configuration ; si MySQL refuse la connexion, l’exception PDO est convertie en erreur applicative avec son origine conservée.

PHP
<?php

declare(strict_types=1);

namespace Carnet\Configuration;

use PDO;
use PDOException;
use RuntimeException;

final class BaseDeDonnees
{
    public static function creer(): PDO
    {
        $hote = getenv('CARNET_DB_HOTE') ?: '127.0.0.1';
        $nom = getenv('CARNET_DB_NOM');
        $utilisateur = getenv('CARNET_DB_UTILISATEUR');
        $motDePasse = getenv('CARNET_DB_MOT_DE_PASSE');

        if ($nom === false || $nom === '' || $utilisateur === false) {
            throw new RuntimeException(
                'La configuration de la base de données est incomplète.'
            );
        }

        $dsn = sprintf(
            'mysql:host=%s;dbname=%s;charset=utf8mb4',
            $hote,
            $nom
        );

        try {
            return new PDO($dsn, $utilisateur, $motDePasse ?: '', [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]);
        } catch (PDOException $exception) {
            throw new RuntimeException(
                'Impossible de se connecter à la base de données.',
                0,
                $exception
            );
        }
    }
}

Les options définissent un comportement cohérent pour toute l’application. `PDO::ERRMODE_EXCEPTION` fait remonter les erreurs sous forme d’exceptions, au lieu de laisser une opération échouer sans signal clair. `PDO::FETCH_ASSOC` demande des résultats sous forme de tableaux associatifs ; le dépôt exploitera ce mode dans la leçon consacrée à la lecture des contacts. `PDO::ATTR_EMULATE_PREPARES` est désactivé afin de ne pas demander à PDO de simuler les requêtes préparées côté PHP.

Par exemple, en environnement local, configurez ces variables avec les paramètres de votre serveur MySQL et le nom de la base créée pour le carnet. La connexion obtenue avec `BaseDeDonnees::creer()` peut ensuite être transmise à `ContactDepot` : le dépôt reçoit un objet `PDO`, sans avoir à connaître le nom d’hôte ni le mot de passe. Aucun appel à la base n’est effectué dans cette leçon ; les premières requêtes seront ajoutées au dépôt dans les leçons suivantes.

À retenir

  • Centralisez la création de la connexion dans `src/Configuration/BaseDeDonnees.php`.
  • Décrivez le serveur, la base et `utf8mb4` dans le DSN MySQL.
  • Fournissez les identifiants par variables d’environnement plutôt que de les inscrire dans le code.
  • Configurez PDO pour signaler les erreurs par exception et définissez le mode de récupération.
  • Transmettez la connexion au dépôt ; les requêtes seront ajoutées dans les prochaines leçons.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.