Page 1 sur 1

Bug ou totallement con ?

Posté : 27 juil. 2007, 14:26
par zevy
Suite à un bug dans notre application, et après qq heures de recherche, nous avons extrait le bout de code suivant. Et là, quel étonnement. La fonction in_array() nous renvoi vrai alors que les valeurs testées sont bel et bien différentes... Démonstration :
<?php
$a = '00100100100100640514';
$b = '00100100100100640512';
$c = array();
array_push($c, $b);
echo "in_array sans param : ".in_array($a, $c)."<br />";   //renvoi vrai  :o
echo "in_array false : ".in_array($a, $c, false)."<br />";    //renvoi vrai  :o
echo "in_array true : ".in_array($a, $c, true)."<br />";      //renvoi faux
?>
Quelqu'un a une explication ?

Posté : 27 juil. 2007, 14:37
par Cyrano
Ça sent le bug dans le moteur PHP..., c'est en tous cas très surprenant et je n'ai pas trouvé d'explication cohérente... :-k

encore plus fort

Posté : 27 juil. 2007, 14:38
par vinz028
$a = '00100100100100640514';
$b = '00100100100100640512';


if ($a == $b)
  echo "vrai";
else
  echo "faux";
//retourne vrai !

if (strcmp($a, $b))
  echo "vrai";
else
  echo "faux";
//retourne vrai aussi !

Posté : 27 juil. 2007, 14:38
par Hubert Roksor
C'est un exemple de retour de flamme du laxisme de PHP concernant les types de variables. Si tu ne précises pas que tu souhaites une comparaison "type safe" (donc avec les troisième paramètres sur true) beaucoup de fonctions (toutes?) PHP considèrent qu'une chaîne entièrement composée de chiffres doit être traitée comme un nombre. Et comme les nombres en question sont trop grands ils sont tous les deux tronqués à la plus grande valeur possible:
var_dump((int) $a, (int) $b);
D'ailleurs, je parle de fonctions mais c'est aussi valable pour les conditions if:
if ('00100100100100640514' == '00100100100100640512')
{
	echo "Surprise !";
}
Mon conseil : utilise des comparaisons strictes (=== ou le troisième paramètre de in_array()) à partout où c'est possible.