Magazine High tech

Firefox bégaie... ou Ma requête PHP est exécutée deux fois !

Publié le 30 juillet 2009 par Dominikg

Aujourd'hui, je vais parler d'un excellent cas de magie noire...

J'étais tranquillement en train de faire de l'insertion de données dans une base, à partir d'un fichier xml récupéré par ftp.

Rien de bien surprenant dans ce programme PHP : lecture d'un fichier zip, extraction des images et du fichier xml, parsing du fichier xml avec un peu de xpath, écriture d'une requête SQL et exécution de cette requête. Ce sont tous des points normalement abordés dans une formation spécialisée base de donnée avec PHP.

Sauf que ...

Chaque requête SQL est exécutée deux fois !

Tiens, tiens ... Il n'y a pas de boucle qu'un mauvais contrôle pourrait faire exécuter une fois de trop.  Relecture du code dans tous les sens, vérifications diverses, contrôle des logs. Conclusion : la page PHP est appelée deux fois de suite lorsqu'on demande son exécution. 

Essai en désactivant les extensions de Firefox (c'est à dire utilisant un profil vierge) : idem.

Essai avec un autre navigateur : la page est appelée une seule fois avec Internet Explorer. A cet instant là, je commence à respirer : tout ce que je connais du fonctionnement du Web n'est pas remis en cause par un sort jeté sur moi et il s'agit simplement d'un problème avec Firefox.

Oui, mais quel problème ? Un peu de recherche sur Google ne me donne guère de réponses. Il y a deux ou trois cas où des développeurs ont eu la même difficulté, qu'ils ont ou pas résolus, avec des méthodes tenant de la magie. En clair, on tripote le code et ça finit par marcher. 

Et enfin, je trouve un rapport de bug : Firefox reloads pages when automatically changing encodings  qui fait réagir mon détecteur de magie.

Il se trouve que je fais afficher, en phase de mise au point, une partie du contenu du fichier xml, codé en unicode. Et que l'entête que le script PHP envoie indique à Firefox que l'encodage est de l'iso-8859.

Firefox commence le chargement de la page en considérant que c'est de l'iso-8859, puis reçoit des caractères unicode, donc effectue une nouvelle requête en ayant ajusté l'encodage de cette page. 

Vérification : je supprime les affichages de mise au point et la page n'est bien exécutée qu'une seule fois.

La conclusion à en tirer est qu'il faut toujours faire attention à l'encodage de ses pages Web, même quand on ne fait que de la mise au point !


Retour à La Une de Logo Paperblog

A propos de l’auteur


Dominikg 19 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossiers Paperblog