8800 sujets

Développement web côté serveur, CMS

Hello,

Je suis en train de récupérer des infos provenant d'une BDD et je les parse dans un xml que j'enregistre (pour une utilisation par flash ensuite, qui était là avant la BDD alors j'adapte).

Problème, lorsque j'affiche dans du html le contenu de ma BDD, tout s'affiche correctement, par contre dès que je mets ça dans mon xml et que je l'enregistres, ça m'affiche tout un tas de caractères bizarres.

J'ai vérifié l'encodage de la BDD, du xml (le fichier lui-même ainsi que l'en-tête) et rien, tout est en UTF-8 et devrait s'afficher correctement.

Quelqu'un a une idée ?

Le code :
$stmt = $pdo->query('SELECT id_availpro, nom, arrondissement, etoiles, x, y, desc_main_en_0, desc_main_fr_0, resa_ds, link1 FROM hotels ORDER BY arrondissement');
	$stmt->execute();
	$rows = $stmt->fetchAll();
	
	$content = array();
	foreach($rows as $key=>$val) $content[$key] = $val;

	$str = '<?xml version="1.0" encoding="UTF-8"?><root></root>';
	$xml = new SimpleXMLElement($str);

	for($i = 1; $i< 21; $i++)
	{
		$xml->addChild('quarter');
		
		foreach($content as $hotel)
		{
			if($hotel['arrondissement'] == $i)
			{
				$xml->quarter[($i - 1)]->addChild('hotel');
				$current = count($xml->quarter[($i - 1)]->hotel);
				
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('id', $hotel['id_availpro']);
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('label', $hotel['nom']);
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('stars', $hotel['etoiles']);
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('x', $hotel['x']);
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('y', $hotel['y']);
				
				$descen = substr(stripslashes(trim(strip_tags($hotel['desc_main_en_0']))), 0, 200) . '...';
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('descen', $descen);
				
				$descfr = substr(stripslashes(trim(strip_tags($hotel['desc_main_fr_0']))), 0, 200) . '...';
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('descfr', $descfr);
				
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('photo', 'http://static.wizzyhotels.com/assets/' . $hotel['id_availpro'] . '/p1_thumb1.jpg');
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('photosmall', 'http://static.wizzyhotels.com/assets/' . $hotel['id_availpro'] . '/p1_thumb2.jpg');
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('link', $hotel['link1']);
				$xml->quarter[($i - 1)]->hotel[($current - 1)]->addChild('book', $hotel['resa_ds']);
			}
		}
	}
	
	
	
	$ress = fopen($_SERVER['DOCUMENT_ROOT'] . '/data/hotels.xml', 'w');
	fwrite($ress, $xml->asXML());
	fclose($ress);
	
	$pdo = null;
Ca n'a certainement rien à voir mais quelque chose me choque dans ton utilisation de PDO : si tu fais un query, l'execute qui suit est inutile. La méthode PDOStatement::execute sert uniquement pour les requêtes préparées.

Sinon, il faut bien vérifier l'encodage à chaque couche pour bien voir où ça coince : en BDD, ce que sort PDO, ce que sort SimpleXML, ce qu'il y a dans le fichier au final. Par exemple, je ne suis pas certain que PDO travaille par défaut en UTF-8 si tu n'as rien précisé en lançant la connexion.

Rahhahaha l'UTF-8..... je sais bien pourquoi j'aime pas cet encodage. Au moins en ISO-8859-1 on n'a jamais aucun problème, et on a rien à gagner d'utiliser UTF-8 tant qu'on ne fait pas d'arabe, de chinois ou une autre langue basée sur un alphabet non latin.
Modifié par QuentinC (11 Nov 2009 - 08:19)
Salut,

Il faut également définir le charset de ta connexion. Lors de la création de ton objet PDO (en admettant que tu utilise MySQL comme BDD) il faut rajouter :
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")


ce qui nous donne :
$pdo = new PDO( 
	'mysql:host=www.monsite.com;dbname=mabasededonnée', 'nomdutilisateur', 'motdepasse',
	array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8') 
);