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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Bug ?] intval et test d'égalité fait ce qui lui plait.


Sujet :

Langage PHP

  1. #1
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut [Bug ?] intval et test d'égalité fait ce qui lui plait.
    Bonjour à tous.

    Je viens vous soumettre un comportement bizarre, en espérant trouver plus d'explications sur le pourquoi du comment ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    	$chaine = "123abc456";
    	$chaine_to_i = intval($chaine);
     
    	if ($chaine_to_i == $chaine) {
    		echo "c'est bon";
    	} else {
    		echo "pas bon";
    	}
    ?>
    il me dit que c'est bon

    Vous avez une explication logique à ça SVP ? Il effectue des conversions implicites au moment du test d'égalité ? bref, je ne sais pas trop quoi penser là...

    d'avance

  2. #2
    Membre actif Avatar de Ryan Sheckler
    Homme Profil pro
    Moine
    Inscrit en
    Novembre 2005
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Moine

    Informations forums :
    Inscription : Novembre 2005
    Messages : 196
    Points : 219
    Points
    219
    Par défaut
    Comme tu le sais, je ne sai pas, mais si je compare la longeur au lieu de comparer les valeurs ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    $chaine = "123abc456";
    $chaine_to_i = intval($chaine);
     
    if (strlen($chaine_to_i) == strlen($chaine)){
    echo "c'est bon";
    } else {
    echo "pas bon";
    } ?>
    ... ce bout de code me dit bien "pas bon".

  3. #3
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    certes, mais ça n'explique pas le comportement bizarre de mon code...


    titou, tout retourné que php y marche pas comme prévu...

  4. #4
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    dans ton test d'égalité, tu compares un_int == une_chaine

    je pense qu'il fait un cast implicite de la chaine en int, donc un intval, donc on a bien la même chose des 2 côtés de l'égalité

    par contre, avec $chaine_to_i = (String)intval($chaine);
    t'as bien "pas bon" pasque tu compares 2 chaines différentes ("123abc456" et "123")

    avec strlen il doit faire le cast implicite de int en string et donc il compare 2 longueurs différentes donc on a bien le résultat attendu

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    Ce n'est pas vraiment un bug, ça vient du fait que PHP effectue bien des conversions implicites si tu testes 2 variables de type différents.

    Dans ton cas $chaine est converti en nombre. Du coup, le test revient à faire :
    if (intval($chaine) == (int) $chaine)
    Ce qui retourne VRAI.

    Si tu veux vérifier que la conversion en entier ne change pas la chaine, il faudrait faire :
    if ($chaine == (string) $chaine_to_i)
    Ainsi tu compareras "123abc456" à "123" ce qui renverra FAUX (les 2 expressions étant de type chaine, aucune conversion ne sera effectuée).

    Les conversions implicites sont documentées sur http://uk2.php.net/manual/fr/languag...comparison.php (Tableau 15-5).

    Bon courage

  6. #6
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    La réponse est "oui", il effectue des conversions implicite au moment du test de l'égalité. Par contre je dois avouer que ce... "plantage" là, m'étonne pas mal... et si quelqu'un a une explication technique en profondeur, j'suis preneur. J'imagine qu'il est possible que pour faire sa comparaison, il tente de convertir la chaine 'chaine_to_i' en int, et pour se faire il utilise en interne 'intval', donc même résultat. Par contre, ca demande éventuellement confirmation d'un expert en la matière.

    Ce que je peux te dire en revanche, c'est que si tu fait ton test avec '===' il n'y a pas de conversion implicite (normal, dans la mesure ou le === teste aussi le typage de la variable) et tout se passe bien.

    J'vais finir par mettre des === partout dans mon code moi...
    Sinon, pour comparer deux chaines (bon, ok, la, c'est pas vraiment deux 'chaines') on peut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (strcmp($chaine_to_i, $chaine) == 0){
    	echo "c'est bon <br>";
    } else {
    	echo "pas bon <br>";

    [EDIT] J'devrai taper mes messages plus vite moi, deux réponses se sont glissé avant la mienne .[/EDIT]
    --
    Rakken

  7. #7
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    beaucoup, je vais me pencher sur ces comparaisons implicites

  8. #8
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par Rakken
    J'vais finir par mettre des === partout dans mon code moi...
    dans mon cas, si je colle un triple égal, ça ne passera jamais, puisque je compare un int à une string... j'irai dans le mur à tout les coups ...

  9. #9
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Certe.

    Alors vive les casts explicite !

    --
    Rakken

Discussions similaires

  1. pb test d'égalité
    Par Choupinou dans le forum Langage
    Réponses: 3
    Dernier message: 28/06/2006, 11h35
  2. [XSL] test d égalité
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 17/05/2006, 14h14
  3. Test d'égalité entre deux algorithmes, ça existe, est-ce faisable ?
    Par davcha dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 25/04/2006, 18h04
  4. Bug avec le test de profondeur
    Par Tellmarch dans le forum OpenGL
    Réponses: 1
    Dernier message: 17/10/2004, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo