IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Un bug PHP lié à Firefox ?

Date de publication : 14/07/2005 , Date de mise a jour : 14/07/2005

Par Genova (Autres articles)
 

Je suis tombé il y a quelques temps sur un bug PHP qui a failli me rendre fou, au bout de trois jours j'ai trouvé la solution là ou jamais j'aurais imaginé qu'elle était, et aussi ettonant cela peut il paraître, ce bug de PHP n'apparait que sous ... le navigateur Firefox !


1. Le bug en question
2. Ce qui est étrange
3. Comment corriger ce bug ?


1. Le bug en question

Je vais ici vous montrer le bug en question, ainsi que la solution pour y remédier. Cependant mes connaissances en fonctionement de navigateur étant quasiment nulles, je ne peux pas expliquer d'où il provient. Tout d'abord créez un fichier include.php qui contient le code suivant :

<?php $ary = array ( ); ?>
Rien de bien méchant pour le moment, ce fichier déclare un tableau vide.
Nous allons ensuite créer un fichier test.php qui va contenir le code suivant :

<?php include('include.php'); $ary[] = array('test'); $fd = fopen('include.php', 'w'); fwrite($fd, "<?php\n" . '$ary = ' . var_export($ary, TRUE) . ';' . "\n?>"); fclose($fd); print_r($ary); echo '<link type="text/css" rel="stylesheet" href="" />'; ?>
Que fait ce fichier exactement ? Nous allons le décrire étape par étape.

  1. On commence par inclure le fichier include.php, on a donc un tableau $ary existant, et vide
  2. Ensuite nous ajoutons un élément à $ary, cet élément est un autre tableau quelconque
  3. Nous allons ensuite écrire ce tableau dans le fichier include.php, en l'ouvrant en écriture (tout en supprimant ce qu'il contenait avant), puis en formatant le tableau $ary sous forme de chaîne de caractère à l'aide de la fonction var_export(). Ainsi dans notre fichier include.php nous devrions nous trouver avec le code suivant :
<?php $ary = array ( 0 => array('test'), ); ?>
Si on test l'éxécution du code, sous firefox tout semble se passer correctement. Pourtant si on ouvre le fichier on ne trouve pas ce qui était prévu mais le double ! C'est à dire que dans le fichier se trouve ceci :

<?php $ary = array ( 0 => array('test'), 1 => array('test'), ); ?>

2. Ce qui est étrange

Dans notre code PHP le tableau ne contient rien au départ, puis nous y inserons une ligne et nous l'écrivons. Le tableau écrit dans le fichier comporte bizarrement deux lignes ! Il y a un autre élément étrange, si vous regarde le code PHP un print_r() du tableau a été mis, on a donc sur notre navigateur firefox le contenu de $ary qui s'affiche. Et pourtant il affiche correctement que le tableau ne contient qu'une ligne à l'écran. Là ou ça devient paranormal c'est que si on regarde la source de la page ... le tableau comporte pourtant les deux lignes, mais ne les a pas affiché à l'écran, Firefox n'affiche pas la même chose à l'écran et dans sa source.


3. Comment corriger ce bug ?

La solution est tout aussi bizarre que le bug, je vous laisse imaginer le temps que j'ai passé pour la trouver. Tout provient de cette ligne de test.php :

echo '<link type="text/css" rel="stylesheet" href="" />';
L'atribut href de la balise link est vide ... Si vous lui donnez une valeur (n'importe quoi, truc.css par exemple) le bug disparaitra, en refaisant le test une seule ligne sera écrite dans le fichier, tout se passera corectement. Vous pouvez tester ce bug sous IE, il n'apparaitra pas. Plutôt étrange non ? En espérant que le groupe Mozilla corrige rapidement ce bug extrèmement déroutant quand on y est confronté.



Les sources présentées sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright Genova. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc.. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets.