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 :

Un test if qui ne fonctionne pas correctement


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 39
    Points : 40
    Points
    40
    Par défaut Un test if qui ne fonctionne pas correctement
    Bonjour,

    J'obtiens quelque chose de bizarre en PHP voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /* Ligne de connexion bdd */
    mysql_connect(...);
    mysql_select_db(...);
     
    $query = 'select * from table';
    $result = mysql_query($query);
    while( $row = mysql_fetch_array($result) ) {
            foreach($row as $cle => $valeur) {
                    if( $cle == "champ1" ) {
                            echo "Ma cle est : " . $cle . "<br/>\n";
                    }
            }
    }
    En sortie j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Ma cle est : 0
    Ma cle est : champ1
    Ma cle est : 0
    Ma cle est : champ1
    ...
    Du coup, je n'arrive pas à comprendre pourquoi quand $cle est égale à 0 il entre quand même dans le if.

    Bien entendu, si je mets un « === » dans le test du if ça corrige le problème, mais je n'ai jamais eu un tel problème avec des anciennes versions de php, et je vais avoir un peu de mal à corriger les « == » en « === » sur tous mes sites !

    Merci d'avance à ceux qui pourront m'aider...

  2. #2
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Salut,

    c'est normal si tu compares une chaîne à 0 la condition sera bonne vu que la chaîne sera transformé en 0. Une chaîne vaux zéro comparé à un entier.


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(0 == "code") echo 'hahaha';
    // affiche bien hahaha
    Zend PHP5 Certification
    MySQL 4 Core Certification

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 39
    Points : 40
    Points
    40
    Par défaut
    Je viens d'essayer encore pire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if( 0 == 'test' ) {
            echo 'Bogus!!';
    }
    Et j'obtiens bien un « Bogus!! » en sortie.

    Je suis inquiet pour mes sites, cela pourrait engendrer d'enorme faille de sécurité cette histoire.

  4. #4
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Vu que tu n'as peut être pas vu ma réponse je rajouterais que c'est bien pour ça
    que l'opérateur === existe comme tu l'as fait remarquer.
    Zend PHP5 Certification
    MySQL 4 Core Certification

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 39
    Points : 40
    Points
    40
    Par défaut
    Ok merci je viens de voir ça sur le site de php, je suis quand même un peu étonné.

    La conversion est bizarre je pensais que cétait plutôt le 0 qui était transformé en '0', et non la chaîne transformé en 0.

    Bon du coup, faut que je vérifie sur tous mes sites que ça ne pose pas de problème.

    Merci pour ton aide.

  6. #6
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Salut,

    C'est pour des cas comme cela qu'il existe des fonctions de vérifications de type, ou de transformations de type

    is_numeric(),intval(), ctype_*

    Voilà fait ton choix dans ces fonctions

    Edit : Le === fonctionne aussi très bien en effet
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 39
    Points : 40
    Points
    40
    Par défaut
    Ben ce genre de fonction on y pense pas quand on veut faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /* Ligne de connexion bdd */
    mysql_connect(...);
    mysql_select_db(...);
     
    $query = 'select * from table';
    $result = mysql_query($query);
    while( $row = mysql_fetch_array($result) ) {
            foreach($row as $cle => $valeur) {
                    if( $cle == "champ1" ) {
                            echo "Ma cle est : " . $cle . "<br/>\n";
                    }
            }
    }
    Dans le if, je m'attends à faire une comparaison de chaîne, donc pourquoi transtyper. Mais c'est là que j'aurais du faire un « === » étant donné que je m'attend à avoir 2 chaînes de caractères, vaut mieux en être sur avec une triple égale.

    Je commence à en mettre, mais mes vieux sites sont pas toujours optimisés...

    Le plus étrange c'est que je n'ai jamais eu le problème auparavent, c'était surement une portion de code qui n'a presque été jamais exécuté. Le hasard fait bizarrement les choses.

    En tout cas, merci, j'étais un peu surpris de la réaction de php...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/01/2011, 23h33
  2. [CSS 2.1] Menu qui ne fonctionne pas correctement avec IE
    Par beegees dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 13/10/2010, 10h37
  3. un test if qui ne fonctionne pas
    Par tortue_22 dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2010, 11h45
  4. Réponses: 2
    Dernier message: 02/01/2010, 12h52
  5. TRIGGER (test avant ajout) ne fonctionne pas correctement
    Par marcusien dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/06/2007, 18h02

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