Aller au contenu
Accueil » [PHP] Configurer PDO pour éviter les erreurs d’encodage

[PHP] Configurer PDO pour éviter les erreurs d’encodage

Sur PHP, si vous utilisez MySQL en guise de base de données, vous ne pouvez pas être passé à côté de PDO (PHP Data Objects), qui vous permet de faire le pont entre votre application et vos data.

Généralement, et également d’après la documentation de PHP, une connexion classique à votre base de données se fait de la manière suivante :

$dbhost = 'localhost';
$dbname = 'my-db';
$user = 'my-user';
$pass = 'my-pass';

$pdo = new PDO(
    dsn: "mysql:host=$host;dbname=$dbname",
    username: $user,
    password: $pass,
);

On a donc un code de connexion assez simple, qui prend en compte uniquement nos paramètres de connexion basiques. Éventuellement, pour gérer l’erreur la plus évidente, mais la plus fatale – soit l’erreur dans un de ces paramètres, et donc l’impossibilité d’accéder à nos données – on peut procéder de la sorte pour intercepter l’erreur qui surviendrait :

try {
    $dbhost = 'localhost';
    $dbname = 'my-db';
    $user = 'my-user';
    $pass = 'my-pass';

    $pdo = new PDO(
        dsn: "mysql:host=$host;dbname=$dbname",
        username: $user,
        password: $pass,
    );
} catch (PDOException $e) {
    die('Connexion à la base de données impossible.');
}

On peut ainsi catcher toute erreur de l’instance PDOException, et venir informer l’utilisateur que la liaison est impossible, tout en ne divulguant pas le pourquoi du comment à l’utilisateur final, ce qui serait bien évidemment une faille de sécurité.

Cependant, mise à part ce problème de connexion, qui n’apparaîtra qu’en cas de force majeure (Serveur MySQL down, Mise à jour des credentials…), vous pouvez tomber sur une anomalie qui est assez perturbante, qui est l’erreur d’encodage.

En effet toute base de données a son encodage, et il faut le définir en amont. Si votre connexion via PDO est déclarée avec un encodage différent de celui de votre base de données (ou si vous ne le spécifez pas, celui par défaut), il y a de fortes chances pour que les traductions des caractères enregistrés dans votre base ne soient pas celles auxquelles vous vous attendiez.

Ceci est d’autant plus vrai dans la langue française. Cette dernière nous apporte certes le bonheur d’avoir un langage très fleuri, mais également truffé de caractère qui ne sont pas souvent natifs et admis dans beaucoup d’encodages (é, à, ç, ù, ê, ï…).

Pour pallier à ce problème, et sachant que l’encodage qui supporte le plus grand nombre de ces cas est l’UTF-8, voici comment procéder pour s’en débarasser :

try {
    $dbhost = 'localhost';
    $dbname = 'my-db';
    $user = 'my-user';
    $pass = 'my-pass';

    // le set names utf8 est super important pour ne pas avoir de problèmes d'accents par la suite :)
    $pdo = new PDO(
        dsn: "mysql:host=$host;dbname=$dbname",
        username: $user,
        password: $pass,
        options: array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
    );
} catch (PDOException $e) {
    die('Connexion à la base de données impossible.');
}

Imaginons que vous vouliez écrire le mot espagnol « Señor« . Il y a de fortes chances que si votre encodage ne correspond pas, vous verrez dans votre navigateur des caractères étanges et illisibles tels que :

  • Señor
  • Se�or
  • Se???or

En ajoutant simplement un tableau d’options spécifiant votre encodage à la base de données, MySQL sera capable de vous traduire vos caractères comme vous le souhaitez.

Et voilà, tout bête n’est-ce pas ?

Étiquettes:

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *