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 :

[PHP-JS] htmlentities ne fonctionne pas après str_replace


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut [PHP-JS] htmlentities ne fonctionne pas après str_replace
    Bonjour
    Je ne comprend rien à mon script : il fonctionne, mais c'est illogique ou en tout cas je ne comprend pas quelque chose.

    Voilà :
    Je reçois des données d'un formulaire, je filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      $contenu=htmlentities($_POST['contenu']);
      $contenu=stripslashes($contenu);
    Comme c'est pour un éditeur de texte, je remplace le bbCode maison par du html :
    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
    $contenu=nl2br($contenu);
    $contenu=str_replace("&lt;br /&gt;", "<br>", "$contenu");
     //idem pour la balise en gras
    $contenu=str_replace("", "<b>", "$contenu");
    $contenu=str_replace("", "</b>", "$contenu");
    //idem pour l'italique
    $contenu=str_replace("", "<i>", "$contenu");
    $contenu=str_replace("", "</i>", "$contenu");
    //idem pour les citations (l'espace entre" et > dans la div permet de le distinguer du "> pour les liens juste en dessous ( je sais c'est foireux, mais ça fonctionne, donc en attendant...)
    $contenu=str_replace("[citer]", "<br><b>citation:</b><br><div class=\"citer\">", "$contenu");
    $contenu=str_replace("[/citer]", "</div>", "$contenu");
    //idem pour les liens (on prend en compte la répétition des http et la position des deux premières lignes doit etre conservées
    $contenu=str_replace("[a=&quot;http://", "<a href=\"http://", "$contenu");
    $contenu=str_replace("[a=&quot;", "<a href=\"http://", "$contenu");
    $contenu=str_replace("&quot;]", "\"target=\"_blank\"\">", "$contenu");
    $contenu=str_replace("[/a]", "</a>", "$contenu");
    Ensuite comme j'envoie le contenu dans un champ hidden je le refiltre comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu=htmlentities($contenu);
    Si je ne filtre pas ainsi juste à la fin, ça s'affiche dans la page et ça foire.

    Ensuite j'envoie dans la base et je ne filtre PLUS RIEN à l'exception d'un mysql_real_escape_string qui n'a pas de rapport ici.

    Alors ma question :
    Puisque je fais un $contenu=htmlentities($contenu) en bout de course, comment ce fait-il que les balises html créées par les str_replace ne soit pas désactivées, alors que les autres caractères spéciaux, par exemle &<, le sont ?
    Car je le répète tout s'affiche bien, mais quand j'ai fait ça j'ai du le faire au petit bonheur la chance et là je ne pige plus du tout.

    Merci pour vos explications si vous en avez.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Je viens de revérifier, effectivement les caractères spéciaux sont bien codés lors de l'affichage, mais ceux issus des_strreplaces qui s'affichent tel quel.
    A croire que le htmlentitites effectués à la fin ne s'applique pas aux balises issues du str_replace, qui pourtant est effectué avant.

    Qui peut m'expliquer cela ?

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Mise au point : htmlentities() ne permet pas de filtrer mais de convertir.
    Tu ne devrais pas l'utiliser pour les données entrantes mais plutôt (et uniquement) pour les données à afficher (dans le navigateur, pas dans la base de données).
    Du coup, ta solution pour filtrer n'est pas adaptée.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    En fait je préfère filtrer (convertir si tu préfère) AVANT parce que si je converti avant l'insertion je le fait une fois, si je converti à l'affichage je le fais xxx fois.
    C'est donc un énorme gain de temps il me semble.

    Par contre pour mon script, qui je l'ai dit fonctionne très bien au demeurant même si je ne comprend pas, j'ai fait quelques tests et j'ai constaté cela, c'est bizarre :

    je converti par htmlentities la balise <w> une seule fois avant l'insertion dans un champ hidden.
    Il y est écrit, lorsque je regarde le code source :
    &lt;w&gt;
    Par contre dans la base il arrive sous cette forme <w> et ne s'affiche donc pas dans la page.
    Or il n'y aucune fonction de conversion entre l'insertion dans le champ hidden, sous la forme &lt;w&gt; suite à la conversion par htmlentities et le moment de l'insertion dans la base, ou l'on retrouve <w>...

    C'est ça que je ne pige pas, parce que si je fais deux fois htmlentities avant l'insertion dans le champ hidden, il y a écrit dans celui-ci :
    &amp;lt;w&amp;gt;, le & de &lt; étant à son tour convertie en &amp;.
    Mais cette fois dans la base on retrouve &lt; et non &amp;lt;.

    Il y a donc une conversion automatique qui se fait entre l'input hidden et l'insertion dans la base, mais je le répète parce que j'ai bien vérifié, elle n'est pas de moi, je ne reconverti/filtre pas entre l'insertion dans le input hidden et l'insertion dans la base.

    Voilà j'espère être assez clair en tout cas j'aimerais bien comprendre le mécanisme.

  5. #5
    Membre émérite
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    C'est donc un énorme gain de temps il me semble.
    Sauf que :
    - tu ne pourras plus faire de recherche dans ta base, MySQL étant incapable de décoder ce bazar
    - si tu veux un jour utiliser ces données pour autre chose que HTML (XHTML, XML, Javascript, CSV, XLS, PDF, ou autre), tu risques d'avoir de gros soucis

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    tu ne pourras plus faire de recherche dans ta base, MySQL étant incapable de décoder ce bazar
    Pour le moment ça ne me pose pas de problème, je convertie le mot à aller chercher et puis il trouve son équivalent convertie dans la base.

    si tu veux un jour utiliser ces données pour autre chose que HTML (XHTML, XML, Javascript, CSV, XLS, PDF, ou autre), tu risques d'avoir de gros soucis
    On me l'a déjà sorti aussi mais pour le moment ça n'est pas le problème et de toute façon un str_replace pour tout reconvertir ça prend 5 minutes et là aussi ça ne se fait qu'une fois en cas de besoin, au lieu de le faire à chaque affichage.
    Donc ça c'est de la pure théorie, mais en pratique, concrètement, ma solution est quand même plus rapide, nonobstant les dits problèmes théoriques.
    Pour le moment, aucun argument ne m'a fait changé d'avis sur ce point, mais bon pourquoi pas, je suis pas borné non plus.


    Par contre pour le problème de l'encodage automatique des caractères spéciaux comme expliqué, pas forcément très bien, dans mon post au dessus, vous en pensez quoi ?
    je converti par htmlentities la balise <w> une seule fois avant l'insertion dans un champ hidden.
    Il y est écrit, lorsque je regarde le code source :
    &lt;w&gt;
    Par contre dans la base il arrive sous cette forme <w> et ne s'affiche donc pas dans la page.
    Or il n'y aucune fonction de conversion entre l'insertion dans le champ hidden, sous la forme &lt;w&gt; suite à la conversion par htmlentities et le moment de l'insertion dans la base, ou l'on retrouve <w>...

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

Discussions similaires

  1. site ASP.NET/Silverlight ne fonctionne pas après publication
    Par TheBlackReverand dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 12/05/2009, 15h11
  2. gotoAndStop ne fonctionne pas apres modification d'un clip
    Par t_o_7_ dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 06/05/2009, 12h35
  3. Réponses: 4
    Dernier message: 06/08/2007, 16h17
  4. [PHP-JS] foreach qui fonctionne pas
    Par tiger63 dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2007, 15h49
  5. Réponses: 4
    Dernier message: 08/02/2007, 20h01

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