Prise en charge encodage utf8 avec PHP et PDO MYSQL
Par aurelien gerits le jeudi, 22 décembre 2011, 23:15 - tutoriel PHP - Lien permanent
La création d'une application ou site internet avec un encodage UTF-8 peut se révéler assez difficile si le travail n'est pas entièrement identifié.
J'ai analysé la problématique de l'encodage UTF-8 lors de la création d'application avec PHP, MYSQL et PDO qui peut dans pas mal de cas être très problématique.
Pour être certain que tous les éléments sont en UTF-8, il faut vérifier les paramètres suivants:
Page HTML ou PHP
[HTML] <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Content Type
[CODE] Content-Type text/html; charset=utf-8
MYSQL
Pour avoir vos tables SQL au format UTF-8, il faut choisir un interclassement ou collation.
Je vous recommande d'utiliser utf8_general_ci ou utf8_unicode_ci pour être certain d'avoir le bon encodage et préparer convenablement votre base de données.
Une fois votre base de données prête, il faut vous connectez à celle-ci depuis votre application ou site internet en utilisant le driver PDO.
Dans certains cas, MYSQL ne supportera pas convenablement l'UTF-8 et insérera du contenu avec des caractères ASCII ce qui peut dans l'évolution de votre site internet poser pas mal de problèmes.
Imaginons que votre base de données contient des champs titres avec des caractères accentués, vous souhaitez faire un moteur de recherche avec LIKE mais les caractères accentués ressemblent à "é".
Vous vous dites ce n'est pas grave, mon navigateur les interprète convenablement !!!
Vous mettez en place une requête SQL avec LIKE et vous testez la recherche avec et sans accent, le problème se révèle enfin car suivant la recherche le résultat est dans pas mal de cas NULL.
Pourquoi les résultats ne sont pas corrects ?
Une recherche sur le mot "catégorie" et "catégorie" n'est pas du tout la même chose pourtant LIKE est insensible à la casse et supporte très bien les caractères accentués !
Quelle solution pour que mes insertions soient réalisées avec de véritable accent ?
- Je modifie chaque ligne à la main dans la base de données pour y insérer des accents (ce n'est vraiment pas conseillé)
- Je modifie le comportement de la connexion entre PHP et MYSQL par l'intermédiaire de PDO
Comment modifier l'encodage de la connexion ?
Avec MYSQL sans PDO:
[PHP] mysql_query("SET NAMES 'utf8'");
Pour rappel on se connecte à PDO de cette manière :
[PHP] $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
Il existe deux méthodes pour forcer l'encodage de PDO, la première fonctionne aussi bien avec MYSQL que POSTGRESQL.
[PHP] $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $dbh->exec("SET CHARACTER SET utf8");
La deuxième méthode est uniquement disponible avec MYSQL:
[PHP] $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") );
Commentaires
MERCI!
c'est
pour Mysql (PHP 5.2.3)
`mysql_set_charset`
et pour PDO (5.3.6)
`mysql:host=localhost;dbname=test;charset=utf-8`
Le probleme avec les SET NAMES c'est que l'échappement n'est pas pris en compte dans le bon encodage (mysql_real_escape_string et pdo::quote)
Bonsoir et merci pour les précisions,
j'avoue ne pas avoir de bug avec SET NAME lorsque j'utilise une requête préparer avec PDO mais je vais tester vos propositions pour les ajouter dans le tuto
Cordialement
Aurélien
Merci beaucoup ces informations me seront très utiles...
Merci pour ces informations.
J'ai pu résoudre mon problème d'encodage entre mon script et ma base.