Pour bien mettre dans le contexte, je travaille essentiellement en UTF-8, que ce soit pour mes fichiers en PHP ou XML mais aussi le contenu de mes bases de données MySQL.

Seulement, si vous essayez de faire comme moi, vous allez vite vous rendre compte que sur certains serveurs, voire votre poste de développement, et bien on a encore des caractères bizarres lors de la lecture dans la base de donnée. Et quand on cherche précisément le problème, on se rencontre que ça vient de la communication entre PHP et MySQL. Ils ont beau tous les deux être en UTF-8, la communication se fait en iso dans ce cas...

Solution 1

La première solution, et la plus radicale, serait de paramétrer correctement MySQL sur le serveur, avec un inconvénient, c'est que tous les sites devront utiliser de l'UTF-8 pour communiquer avec MySQL. Ce n'est pas un problème si c'est un serveur dédié, ou un poste de travail... et quoi que, imaginez que vous deviez utiliser en plus une application extérieure qui fait de l'iso. Il vous faudrait alors vous plonger dans le code de cette appli pour trouver où et comment adapter le nécessaire.

Bon je vous dit tout de même comment faire, car si vous testez juste deux ou trois trucs sur votre PC pour découvrir Prado, et bien ça suffira amplement.

Sous linux, dans le fichier /etc/mysql/my.cnf cherchez la section [mysqld] puis ajouter à la fin les deux lignes suivantes :

character-set-server=utf8
skip-character-set-client-handshake

Pour windows vous trouverez un fichier en .ini dans le répertoire d'installation de MySQL, ou bien vous pouvez directement créer le fichier suivant c:/windows/my.cnf et y écrire le nom de la section puis les deux lignes ci-dessus.

N'oubliez pas ensuite de relancer le serveur MySQL, sous linux la simple commande que vous devez connaitre :

$ /etc/init.d/mysql restart

Mais attention, cette solution oblige le serveur à travailler en utf-8 et à ne pas se préoccuper de la volonté éventuelle des clients de travailler avec autre chose...

Solution 2

La deuxième solution et donc celle qui nous intéresse, est de préciser à chaque connexion à MySQL que l'on souhaite travailler en utf-8. Et pour se faire il suffit donc d'exécuter la requête suivante juste après s'être connecté à notre base de donnée :

SET NAMES 'UTF8';

L'inconvénient c'est qu'il faut le faire à chaque connexion... et c'est là qu'il faut s'interroger un minium pour Prado.

Le premier réflexe pour beaucoup, d'après ce que j'ai vu dans le forum de Prado, est d'ajouter cette ligne dans le constructeur de chaque page, ou avant chaque requête qui pause problème... mais c'est pas vivable. Autant le faire au bon endroit, une bonne fois pour toute et ne plus avoir à s'en occuper non ?

Et bien pour ma part, utilisant les ActiveRecord, j'ai décidé de surcharger simplement la méthode init de la classe TActiveRecordConfig. Dedans je fais un appel à la connexion et je lance ma requête. Comme ceci sera la première méthode appelée du fait d'être le module associé directement pour ça, on est sûr que toute nos connexions seront bien configurer en UTF-8, et ce, sans avoir besoin de toucher au serveur.

En pratique voilà ce que ça donne :

On créer la classe contenant la surcharge, je la met dans protected/common/MTActiveRecordConfig.php :

<?php

Prado::using('System.Data.ActiveRecord.TActiveRecordConfig');
 
class MTActiveRecordConfig extends TActiveRecordConfig
{
	public function init($xml) {
		parent::init($xml);
 
		$connection = $this->getDbConnection();
		$connection->Active=true;
		$command=$connection->createCommand("SET NAMES 'UTF8'");
		$command->execute();		
	}		
}
?>

Dans le fichier protected/application.xml :

<module id="db" class="System.Data.TDataSourceConfig">
  <database ConnectionString="mysql:host=myserver;dbname=mydatabase" 
    Username="mydatabase_user" Password="**********" />
</module>
<module class="Application.Common.MTActiveRecordConfig" ConnectionID="db" />

Pour les curieux, j'ai appelé ma classe MTActiveRecordConfig avec M au début afin de bien la différencier des classes Prado, mais tout en marquant bien que c'est une simple surcharge... Les développeurs de Prado, on justement décidé de préfixer le nom de toutes leurs classes par un T. Du coup c'est bien pratique et de mon côté quand je modifie une classe je me contente de rajouter un M (genre M(y)T) devant le nom de la classe, et puis on ajoute un petit extends vers la vrai classe, et le tour est joué ;-)

Autre avantage de cette solution, c'est qu'il suffit de recopier le fichier tel quel dans tout nouveau projet sans avoir rien d'autre à faire... en attendant que soit Prado propose une solution, soit PHP... dans la version 6 ?!?

Voilà, j'espère que ça aura aidé certains d'entre vous.

Pour aller plus loin :