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 :

$Hello_world of php.


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut $Hello_world of php.
    Dans un premier temps, bonjour à tous.

    Si je décide de poster dans votre forum aujourd'hui, c'est pour un problème plutôt récurent, un caractère invisible qui vient se placer à la fin d'une variable lors d'une incrémentation++;
    Je vais détailler du mieux possible mon problème et les tests que j'ai effectué via l'aide d'une autre communauté, ou de moi même.

    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    	<head>
    		<title>Index.</title>
    		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
    	</head>
    	<body>
    		<?php
    		$monfichier = fopen('compt.txt', 'r+');
     
    		$pages_vues = fgets($monfichier);
    		$pages_vues++;
    		fseek($monfichier, 0);
    		fputs($monfichier, $pages_vues);
     
    		fclose($monfichier);
     
    		echo'<p>Cette page a été vue ' . $pages_vues . ' fois !</p>;
    		?>
     
     
    	</body>
    </html>
    Infos :

    Os : Linux Ubuntu 9.10 karmic.
    Navigateur : FireFox 3.5.8.
    Environnement de dev : Xampp.
    Version de php : 5.3.1.
    -----------------------
    Apparition du bug : uniquement avec l'incrémentation de forme $pages_vues++;
    Other : Les formes $pages_vues+=1; $pages_vues = $pages_vues + 1; fonctionnent.
    var_dump($pages_vues) : (avec le fichier texte initialisé à 0) Retourne cela : string(2) "0 "
    Fichier texte initialisé à 0 via : (je n'ai pas touché à l'encodage de ces éditeurs de textes) gEdit, gVim, jEdit.

    J'ai remarqué que, si j'écrivais dans le fichier .txt via un script php, l'incrémentation de forme $pages_vues++; fonctionnait sans poser de problèmes.
    En ayant parcouru votre forum, je suis tombé sur la fonction ord pour identifier le caractere mystérieux, je n'ai pas su l'adapter (je débute en php depuis quelques jours).

    Je joints mes deux fichiers sous un unique zip, si jamais vous voulez voir l'encodage du fichier par exemple.
    En espérant avoir des infos pour résoudre ce facheux probleme.
    Fichiers attachés Fichiers attachés
    Dernière modification par Jannus ; 20/03/2010 à 14h59. Motif: Abus de mise en forme

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    278
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 278
    Par défaut
    Mais le problème se situe ou? Lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo'<p>Cette page a été vue ' . $pages_vues . ' fois !</p>;
    Tu obtiens quoi?

    Je comprend pas bien le problème perso

    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Si tu transforme ta chaine en int le caractère dont tu aprle devrait disparaitre non?
    $pages_vues = intval($pages_vues)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Hello, oui en effet forcer le type contourne le probleme, je dis bien contourne, car les gens a qui je donne le script n'ont pas besoin de faire cela, et moi visiblement je le suis.

    J'ai tout expliqué on ne peut pas plus clairement sinon.

  4. #4
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 494
    Par défaut
    Je vois pas de problème par contre ton script ne marche pas chez moi, je suis obligé de remplacer "$pages_vues++;" par "$pages_vues+=1;"

    EDIT : J'ai retapé ton code en entier et maintenant ça fonctionne, j'ai déjà eu un truc du genre une fois, en retapant très exactement le problème disparaît...

    Essaye d'utiliser mon fichier pour voir
    Fichiers attachés Fichiers attachés

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Etant donné que $pages_vues vient des données du fichier "compt.txt", c'est ce fichier qui contient le caractère étrange. Enfin, théoriquement.

    Ensuite, je vois que tu utilise du utf-8, alors peut être y a t-il une cause à effet.
    Selon l'éditeur de texte, il se peut qu'il insère des caractères pour le spécifier : le BOM.
    Si c'est le cas, faudrait créer un fichier en spécifiant : sans BOM, ou alors en l'ouvrant avec un éditeur qui affichera ces caractères et qui permettra de les supprimer.

    A titre d'exemple, en créant un nouveau fichier avec le bloc note en UTF-8, il insère ces caractères, mais je ne le vois.
    En l'ouvrant avec un autre éditeur (comme PsPad), je les vois, c'est ceci : 


    Pas certain que ce soit ça ton problème, mais sait on jamais.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    A priori c'est un "bug" logique, sans l'être, mais en l'étant un peu quand même.

    Tout élément externe à un script, donnée récupérée d'une DB, d'un fichier, en get/post ou autre est tout d'abord typé en string. PHP est souple sur les conversions ce qui fait que String + 1 est automatiquement casté (String + int => int), String++ par contre ne l'est pas.

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    PHP est souple sur les conversions ce qui fait que String + 1 est automatiquement casté (String + int => int), String++ par contre ne l'est pas.
    Tu en est sûr de ça ?

    Si je fais (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pages_vues = (string)'5';
    $pages_vues++;
    echo '$pages_vues : '.$pages_vues;
    Affiche -> $pages_vues : 6

    Même en "forçant" le type à string et en plus mis entre quote, l'incrémentation ce fait.
    Donc Php le "caste" comme tu le dis, même pour un string clairement défini.

    J'ai peut être mal compris, ceci dit

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    En effet !

    Y'a des fois des trucs étonnants avec PHP

    en s'appuyant sur le code de blueice :

    $pages_vues++ ne fonctionne pas.
    $pages_vues+=1 fonctionne puis :
    $p = (string) $pages_vues;
    $p++ fonctionne...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Hey! Merci pour les réponses, et vos tests. (blueice, merci à toi pour le script)

    J'ai réalisé quelques autres tests entre temps :

    - Quand j'ouvre le fichier crée sous linux, sous windows avec blocnote, le 0 est un petit carré.
    - Avec Notpad++ le 0 est bien un zero!
    (Notepad++ est en encoding ANSI, sous linux mes éditeurs sont en UTF-8, il n'y a pas l'ANSI, et je ne trouve pas l'équivalent)
    - Toujours est il que tel quel, il ne fonctionne pas sous windows, il me faut effacer le 0 et écrire de nouveau 0.

    Si quelqu'un pouvait réaliser le test sous linux parmi-vous, et constater quels sont vos encodages pour, respectivement : fichier texte / éditeur / navigateur.
    Je pense qu'il me suffira a l'avenir de forcer le type lors de l'écriture / lecture d'un fichier texte. Il ne devrait pas y avoir de répercutions autre que celle ci.

    Beaucoup de réflexion pour si peux.

    @Petibidon : Serais tu sous Linux?
    Dernière modification par Jannus ; 20/03/2010 à 15h00. Motif: Abus de mise en forme + fusion

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Oui.

    truc étonnant d'ailleurs, si j'initialise le ficher compt.txt de cette manière :

    $ echo 0>compt.txt

    un var_dump( $page_vues ) me renvoie bool( false ). Sinon string pour toute autre valeur.

  11. #11
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Même si dans le fond le problème serait lié au système, tu ne devrais pas rencontrer ce problème.

    Faudrait à mon sens créer un fichier avec NotePad++, encodage utf-8 sans BOM (si on recherche sur le Net, plus d'un s'est fait pigé), et tu upload ce fichier sur ton hébergement en mode binaire (pas en ANSI).

    Le tout c'est de conserver le même encodage partout.
    En tout cas, j'ai jamais rencontré ce problème, même sur Wind XP et sur Linux (hébergeur).

  12. #12
    Invité
    Invité(e)
    Par défaut
    Je suis sous linux la, avec mon serveur en local via lampp. Et j'ai essayé avec mon portable a coté sous windows xp (qui lui a wamp).
    Je ne pense pas que le probleme soit lié a l'os, mais plutot aux éditeurs de texte.

  13. #13
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    un var_dump( $page_vues ) me renvoie bool( false ). Sinon string pour toute autre valeur.
    Essai avec un strlen() pour savoir combien de caractères contient le fichier, de même que le nombre de lignes.

  14. #14
    Invité
    Invité(e)
    Par défaut
    En utilisant le fichier texte crée avec le blocnote windows, le probleme n'est pas.
    On pourrait identifier le caractere avec la fonction ord je crois, mais je ne sais pas comment l'utiliser!

  15. #15
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je ne pense pas que le probleme soit lié a l'os, mais plutot aux éditeurs de texte.
    Je pense aussi, et plus particulièrement de l'encodage.
    Je reste d'avis sur : UTF-8 sans BOM.

    Je travail dans 90% des cas sur Wind XP et fait des essais de temps à autre sur un Xubuntu, j'ai jamais eu de problème.
    Par contre, j'ai jamais utilisé ANSI, que du UTF-8.


    Supprime ce fichier, recrée en un autre avec un bon encodage.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Mais mes éditeurs sous linux sont tous en UTF8 de base. lol.

  17. #17
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par Snufix
    Mais mes éditeurs sous linux sont tous en UTF8 de base. lol.
    Avec ou sans BOM ?

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Le BOM n'existe pas sous linux.
    Ou du moins aucun éditeur sérieux ne met de BOM.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Ca ne je sais pas. gEdit n'a quasi pas de parametres, en tous cas je ne vois rien en rapport avec BOM ou sans BOM. gVim et jEdit je regarde.

  20. #20
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Le BOM n'existe pas sous linux.
    Ou du moins aucun éditeur sérieux ne met de BOM.
    Bon, ce n'est peut être pas un problème de BOM, ne pas se focaliser dessus du coup.

    Mais vu que ce fichier comporte un problème, faudrait le supprimer, au moins ça.
    En créer un autre, quitte à utiliser un autre éditeur, mais avec un bon encodage.
    Ou alors utiliser un fichier existant, le renommer et tout supprimer ce qu'il y a.

    Je ne vois pas d'autre solutions.

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. L'avenir est-il au PHP ?
    Par Manolo dans le forum Langage
    Réponses: 468
    Dernier message: 11/02/2008, 18h54

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