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 :

comparaison utilisant un substr, qui se passe mal


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut comparaison utilisant un substr, qui se passe mal
    Bonjour,

    hier soir, je suis tombé sur un bug étrange. Me disant que j'étais peut-être fatigué, j'ai attendu ce matin, mais comme je n'arrive toujours pas à résoudre le problème, je poste.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
             $deb_header=trim(substr($header,0,9));echo "header=".$header."<br/>deb_header=".$deb_header."<br/>comp=".($deb_header!="SESAID")."<br/>";
     
            if ($deb_header!="SESAID")
            {
               ...
            }

    affiche
    header=SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL
    deb_header=SESAID
    comp=1
    et donc on passe dans le if alors qu'il ne faudrait pas. Où est le problème ? Y a un truc bizarre : pour obtenir une chaîne longue de 6 caractères (SESAID) je dois faire substr($header,0,9) au lieu de substr($header,0,6) et le trim, c'était au cas où, mais ça n'arrange rien.

  2. #2
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Points : 50
    Points
    50
    Par défaut
    chez moi, ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $header='SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL';
     
    $deb_header=substr($header,0,6);
    echo "header= $header <br />";
    echo "deb_header= $deb_header <br/>";
     
            if ($deb_header!="SESAID")
            {
               echo "pas bon <br />";
            }
            else {
              echo "bon <br />";
            }
    fonctionne très bien

    résultat :
    header=SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL
    deb_header= SESAID
    bon

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,

    Commence par nous dire d'où provient ce contenu.
    D'un fichier .txt ?

    J'ai fait l'essai avec un fichier header.txt, contenant cette simple ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $header = file_get_contents('header.txt');
    Pour être obligé d'utiliser substr($header,0,9) au lieu de substr($header,0,6), j'en ai déduit que le fichier est enregistré avec un BOM : cela expliquerait les 3 caractères (invisibles) en trop au début.


    Solution 1 : ré-encoder le fichier .txt en UTF-8 SANS BOM

    Solution 2 : supprimer le BOM (via une fonction trouvée sur le web)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Remove UTF8 Bom
    function remove_utf8_bom($text)
    {
        $bom = pack('H*','EFBBBF');
        $text = preg_replace("/^$bom/", '', $text);
        return $text;
    }
     
    $header = remove_utf8_bom($header);
    $deb_header = substr($header,0,6);
    N.B. Compte tenu de la structure de la chaine ("mots" séparés par des , on peut aussi utiliser explode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $deb_header = explode(';', $header)[0];
    Dernière modification par Invité ; 26/12/2019 à 15h52.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Chez moi aussi. Comme la donnée vient d'un fichier csv, je l'ai affichée et du coup, ça ne marche plus :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        $header='SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL';
     
     
    $deb_header=substr($header,0,6);
    echo "header= $header <br />";
    echo "deb_header= $deb_header <br/>";
     
            if ($deb_header!="SESAID")
            {
               echo "pas bon <br />";
            }
            else {
              echo "bon <br />";
            }
    Par contre, quand je fais un copier-coller de mon navigateur (IE pour le wampserver du boulot), y a un caractère ésotérique visible dans mon éditeur de code (Visual Studio) mais pas visible dans le navigateur (un point d'interrogation avec comme fond d'écran un losange comme sur cette image :
    Nom : KK2.png
Affichages : 135
Taille : 40,8 Ko )

  5. #5
    Invité
    Invité(e)
    Par défaut
    Donc, j'ai fait une recherche internet...


    On peut modifier la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Remove UTF8 Bom + espace insécable de larguer zéro
    function remove_utf8_bom($text)
    {
        $bom = pack('H*','EFBBBF');
        $text = preg_replace("/^$bom/", '', $text); // BOM
        $text = preg_replace("//Ui", '', $text); // espace insécable de larguer zéro
        return $text;
    }
     
    $header = remove_utf8_bom($header);
    N.B. Par contre, je ne retrouve pas le même comportement avec & #65279 ; qu'avec le BOM en trop...

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Jérôme, j'ai supprimé le BOM avec la solution 2 de ton post #3. C'est OK

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

Discussions similaires

  1. Entretien chez Page Personnel qui se passe mal.
    Par stpaul04 dans le forum Entretien
    Réponses: 10
    Dernier message: 16/10/2017, 11h04
  2. Nouvelle installation qui se passe mal
    Par kal1n dans le forum XMLRAD
    Réponses: 1
    Dernier message: 30/04/2015, 21h23
  3. [XL-2013] Copier / coller de cellule qui se passe mal
    Par ranzoken dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/01/2015, 16h53
  4. Déploiement qui se passe mal
    Par -=Spoon=- dans le forum JOnAS
    Réponses: 4
    Dernier message: 14/10/2009, 11h56
  5. Une addition qui se passe mal
    Par Romanodi13 dans le forum ActionScript 3
    Réponses: 6
    Dernier message: 30/12/2008, 14h20

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