MySQL et PHP : problème d’encodage UTF-8 et ISO-8859-1
Lorsqu'on créait des tables Mysql avec PhpMyAdmin (par exemple), elles sont créés par défaut avec l'encodage latin1 (ISO-8859-1).
Même en convertissant manuellement les tables en UTF8, PHP interprète toujours les données de la table au format latin1, ce qui se traduit par des erreurs d'affichage sur les caractères spéciaux.
Le fait que le fichier source PHP ait UTF-8 comme encodage par défaut (paramètre définit dans Dreamweaver) et que le meta http-equiv="Content-Type" est bien défini à text/html; charset=utf-8 n'y changera rien.
La solution :
Après avoir établi la connexion à la base de données, on défini le type d'encodage via la fonction
mysql_set_charset("utf8");
Ce qui donne par exemple :
class dBEx {
private $dbh;
private $encodage:
function connect ($dbuser, $dbpassword, $dbname, $dbhost) {
$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
$this->encodage = mysql_set_charset("UTF-8");
...
}
...
}
PHP et Apache affichent maintenant les caractères en UTF-8 tels quels dans la table.
Mon WAMP maison
En attendant de tester un système WAMP tout-en-un récent (type WAMPServer ou EasyPHP), je bidouille pour ma propre installation du trio "Apache / MySQL / PHP" sous Windows XP/Vista (dans le cadre de l'étape de developpement, pas en cas de serveur de prod, je suis pas inconscient non plus :^)
La raison pourquoi je n'utilise pas de système WAMP tout-en-un est que leur interface personnalisée me gonfle assez. Même si je dois reconnaître que WAMPServer a des qualités indéniables comme le fait de pouvoir installer et utiliser plusieurs versions d'Apache / Php et MySQL : très pratique si on héberge ses sites chez les serveurs de plusieurs prestataires qui utilisent des versions de MySQL différentes (4.1, 5.0, 5.1).
Je ne vais pas détailler l'étape d'installation (dont je traiterais plus tard) d'un serveur WAMP. Cet article est plutôt utilisé comme mémo personnel :
Après avoir installé et configuré Apache, MySQL et PHP dans les répertoires respectifs V:\Webmaster\Apache, V:\Webmaster\MySQL et V:\Webmaster\PHP, je peux changer de machine ou réinstaller Windows, je n'ai pas à réinstaller à chaque fois ces serveurs. Je fais juste ceci (en tant qu'administrateur) :
- Copier mon php.ini (situé dans V:\Webmaster\PHP) dans C:\Windows
- Copier libmcrypt.dll, libmysql.dll et libmhash.dll (situés dans V:\Webmaster\PHP) dans C:\Windows\System32. Ces extensions me sont utiles pour PhpMyAdmin.
- Copier mon fichier hosts personnalisé qui tient compte de tous mes hôtes virtuels Apache (vhosts) (que j'ai placé dans V:\Webmaster\ADMIN\A INSTALLER\C-Windows-System32-drivers-etc pour ne jamais l'oublier) vers C:\Windows\System32\drivers\etc.
- Ensuite j'installe Apache en tant que service : dans une ligne de commande :
>v:\Webmaster\Apache\bin\httpd -k install
Installing the Apache2.2 service
The Apache2.2 service is successfully installed. - Ensuite j'installe le service MySQL :
>v:\Webmaster\MySQL\bin\mysqld --install
Service successfully installed. - Pour PHP, il n'y a rien à faire, puisque la configuration d'Apache (le httpd.conf) tiens compte de l'extension PHP. Dans V:\Webmaster\Apache\conf\httpd.conf :
PHPIniDir "V:\Webmaster\PHP\"
LoadModule php5_module "V:\Webmaster\PHP\php5apache2_2.dll" - Ensuite je démarre les services Apache et MySQL en ligne de commande :
>net start apache2.2 && net start mysql
Le service Apache2.2 démarre.
Le service Apache2.2 a démarré.
Le service MySQL démarre.
Le service MySQL a démarré.
Certes, c'est une bidouille plus complexe que l'installation d'un EasyPHP ou WAMPServer, mais je n'ai pas besoin de tout ce côté "pris par la main / facilité" d'un tout-en-un. Je ne sais pas si les tout-en-un se sont améliorés mais je garde un mauvais souvenirs de EasyPHP qui par défaut permettait à n'importe qui d'accéder à l'interface d'administration (et de l'ensemble des dossiers des projets web, vhosts, etc..) directement via http://votre_adresse_ip/. Au moins avec ma solution tirée par les cheveux je reste maître des accès.
Et hop mes sites locaux parfaitement accessibles :
Note pour plus tard : Faire un script batch qui ferait tout ceci de manière automatique.
