picture picture
juillet 18, 2009 MySQL, PHP 3 Commentaires

Les problemes d’encodage UTF-8 entre une base mySQL et une page PHP…

Les forums de développeurs sont remplis de questions relatives à ce problème : « Help ! Je vois des carrés, des ? ou des signes bizarres qui s’affichent sur les pages de mon site à partir des extractions de ma base des données ! »
Cela peut effectivement être assez complexe si le site est mal conçu dès le départ. Il faut permettre à la fois à la base et à la page de parler le même langage : soit UTF-8 pour des pages destinées à un affichage international, soit ISO-8859-1 pour des pages destinées à un affichage exclusivement français.
Pour débuter, un peu de méthode s’impose…

Il y a des tutoriaux très savants qui parlent sur Internet du pourquoi et du comment de ces protocoles de communication… Pour ma part je partagerai ici simplement la façon dont je procède pour éviter la plupart des soucis.
Je prend l’exemple d’un encodage UTF-8, qui présente l’avantage de permettre l’affichage du texte sur n’importe quel navigateur de la plupart des pays. Internet n’a pas de frontières…

Les en-têtes des pages du site

pour commencer, doivent comporter clairement la mention de l’encodage choisi :

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ma page</title>
</head>

La base des données

doit elle aussi être encodée en UTF-8, il sera donc nécessaire de le spécifier clairement lors de sa création dans phpMyAdmin :

Les tables de la base des données

de la même manière, il va maintenant être nécessaire de spécifier que l’on souhaite que chaque champ soit correctement encodé :

NB : 2 astuces pour convertir rapidement toute une table ISO-8859-1 en UTF-8 :
– la commande SQL ad-hoc :
ALTER TABLE `ma_table` CONVERT TO CHARACTER SET 'UTF8';
– Si vos tables présentent des caractères mal encodés, exportez la avec NotePad++ > selectionnez ‘fichier’ – ‘enregistrer sous’ > choisissez l’ option de format UTF-8 …

Les insertions et extractions de la base

En principe cette configuration nécessiterait un utf8_decode() de toutes les variables avant de les envoyer dans la base, et un utf8_encode() sur ces mêmes variables après extraction avant affichage correct… Ce n’est pas simple.

Pour éviter ces encodage / décodage à répétition, les connexions seront elles aussi à correctement spécifier ainsi :

<?php
// CONNEXION à la base
$db_link = mysql_connect ("localhost", "root", "") or die ('Je ne peux pas me connecter à la base parceque : ' . mysql_error());
mysql_select_db ("ma_base");

// INSERTION d’une variable
@mysql_query(« SET CHARACTER SET ‘UTF8′ »);
$nom = addslashes($nom);
$requete = « INSERT INTO ma_table (nom) VALUES(‘$nom’) »;
$result = mysql_query($requete) or die(‘Erreur SQL !<br />’.$requete.'<br />’.mysql_error());
mysql_close();

// OU MISE A JOUR d’une variable
@mysql_query(« SET CHARACTER SET ‘UTF8′ »);
$nom = addslashes($nom);
$requete = « UPDATE ma_table SET nom=’$nom’ WHERE id=’$id' »;
$result = mysql_query($requete) or die(‘Erreur SQL !<br />’.$requete.'<br />’.mysql_error());
mysql_close();

// OU EXTRACTION et AFFICHAGE d’une variable depuis ma_table :
$requete = « SELECT nom FROM ma_table WHERE id=’$id' »;
$result = mysql_query($requete) or die(‘Erreur SQL !<br />’.$requete.'<br />’.mysql_error());
mysql_close();
list($nom) = mysql_fetch_row($result);
mysql_free_result($result);
echo stripslashes(htmlentities($nom));
?>

NB : la fonction html_entity_decode() ne fonctionne qu’à pertir de la version 4.3 de PHP

Ce sont de exemples extrêmement simples, mais ils permettent d’éviter la plupart des pièges de l’encodage…

thx

3 Responses to “Les problemes d’encodage UTF-8 entre une base mySQL et une page PHP…”

2 Commentaires

  1. John dit :

    Une chose, il faut completer
    $bdd = new PDO(‘mysql:host=localhost; dbname=la_base’, ‘root’,  »);

    en

    $bdd = new PDO(‘mysql:host=localhost; dbname=la_base’, ‘root’,  », array(PDO::MYSQL_ATTR_INIT_COMMAND => « SET NAMES utf8 »));

  2. John dit :

    Excellent! ça marche très bien. Merci!

One Trackback

  1. […] Le sujet a déjà été traité mais une petite synthèse ne fait pas de mal ! […]

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: