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

PHP & Base de données Discussion :

Encodage, accents et Html tags: problème [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Encodage, accents et Html tags: problème
    Salut tout le monde,

    J'ai commencé le php il y a peu de temps, et j'ai un souci.
    Je m'explique: Afin de m'entraîner, je me suis lancé un petit défi: faire un système semblable à celui de Twitter.
    Autrement dit, un système avec un espace membre qui permettrait de laisser des messages courts de 140 caractères avec des possibilité de réponses et tout.
    Pour l'instant, je pense m'être pas trop mal débrouillé, le code semble propre, ça fonctionne bien.

    Cela dit, je me suis rendu compte qu'il y avait un problème sur la limite des caractères.
    Comme je l'ai dit, j'aimerai que le message qu'on poste à partir de ce système ne doit pas excéder 140 caractères. J'ai donc mis sur la base de donnés un VARCHAR de 140.
    Le problème, c'est que l'on peut rentrer toutes sortes de balises html et ainsi bousiller la mise en page avec un simple message posté par n'importe qui (par exemple avec un "</div>").
    Du coup, j'ai mis une ligne de code que j'ai trouvé sur php.net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Variable=htmlentities($Variable, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    Grâce à cette dernière, les balises html ne sont pas prise en compte.
    Le problème, maintenant c'est que l'UTF-8 convertit les caractères à accent en plusieurs caractères. Ce qui fausse complètement la limite des 140 caractères voulue à la base.
    J'ai essayé de changer le système d'encodage mais ça n'a pas été fameux. Je me tourne donc vers ce forum pour essayer d'obtenir une solution.

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    La solution pour respecter ta limite de caractère est d'applier htmlentities (ou htmlspecialchars, ça devrait suffit pour pas prendre en compte les balises) juste au moins de l'affichage sur ta page.
    Dans ta base de données, tu enregistres les données telles que saisies par l'utilisateur (tu as juste à les protéger quand tu exécutes ta requête SQL).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Merci !
    Mais ça ne marche pas encore totalement.
    J'ai mis le "htmlentities" à la lecture des données et non lors de l'écriture.
    Pour les tags html ça marche très bien (La donnée dans la db est identique à celle de l'affichage et de l'écriture). Mais pour les accents, il y a toujours un problème:
    Si j'écris "é è ç à ù", j'obtiens dans la db "é è à ç ù".
    Cela ne fausse pas l'affichage puisqu'il y a l'htmlentities qui gère ça mais fausse la limite de caractère.
    Apparemment, cela viendrait cette fois-ci de la base de données.
    J'ai vu que l'on pouvait changer l'encodage du VARCHAR dans l'onglet collation. Je pense que ça vient de là mais je ne sais pas quoi choisir, voici un screen:

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Pour l'utf-8, choisir "utf8_general_ci".
    Cela te permettra de faire des recherches insensibles aux accents et à la casse.

  5. #5
    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 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Pour que le contenu des tables soit "propre" je fais mysqli_query($id_conni,"SET NAMES 'utf8'");

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Pour que le contenu des tables soit "propre" je fais mysqli_query($id_conni,"SET NAMES 'utf8'");
    Oui effectivement, il ne faut pas oublier cela non plus, côté php.
    Juste une petite remarque, avec mysqli et PHP 5 >= 5.2.3 et MySQL 5 >= 5.0.7, il vaut mieux faire (recommandations du manuel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_set_charset($id_conni,'utf8');
    mais pour les versions inférieures à PHP 5 < 5.2.3 ou MySQL 5 < 5.0.7 ta solution était la seule possible. Avec mysql (mais l'extension est dépréciée), on peut faire aussi : mysql_query("SET NAMES 'utf8'");

  7. #7
    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 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Merci, savais pas.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Merci pour vos réponses.
    Cependant, je n'ai toujours pas résolu mon problème.
    J'ai réussi à afficher les caractères à accents dans la db grâce à ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $twouit=htmlentities($twouit, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    $twouit=html_entity_decode($twouit);
    Les signes bizarres générés par les caractères à accent sont codés en UTF-8 puis décodé pour obtenir le vrai caractère.
    Apparemment, ça marche: les caractères à accents apparaissent bien dans la db.
    Mais, il y a encore un problème !
    En effet, lors de la lecture des données, si un petit malin entre un "</div>", il peut tout casser. J'en reviens donc à mon point de départ.
    Comme je l'avais dit dans les premiers messages, lors de la lecture, j'avais mis ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $twouit=htmlentities($twouit, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    Si je le laisse, les balises html ne fonctionnent pas, c'est bien MAIS s'il y a des caractères avec des accents, ça n'affiche rien. Si je l'enlève, les balises html entrées sont valides et les caractères à accents sont remplacés par des "�".

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Houlà, quel bin's !!

    Climoo t'a déjà expliqué : Tu enregistre les données sans rien appliquer comme fonction lors de l'enregistrement en bdd, excepté mysql_real_escape_string (ou équivalent si tu utilise pdo).

    Et à l'affichage et à l'affichage seulement tu applique simplement htmlspecialchars.

    C'est tout.

    Si tu as des pb d'accents, c'est que tu n'as pas suivi toutes les étapes pour un bon encodage en utf-8. Il faut suivre un tuto et ne manquer aucune étape.
    Tu en trouveras des bons en rentrant "tuto encodage utf-8" dans google et d'ailleurs on trouve aussi celui de développez.net

    Pour le reste comme dit plus haut, un simple htmlspecialchars permet de ne pas interpréter les balises html/php.
    La preuve , teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo htmlspecialchars('<div style="border:1px solid red">toto</div>');
    echo '<br>sans htmlspecialchars : <div style="border:1px solid red">toto</div>';
    note : il y a au minimum quatre étapes à ne pas manquer pour un encodage utf-8 cohérent. Je t'en ai déjà donné une avec le type d'encodage à utiliser dans ta table, et laurentSc une deuxième avec la requête à faire avant toute autre requête. La troisième est d'envoyer un header php utf-8, d'être conforme dans ton entête html (mais l'entête php a la priorité) et enfin d'enregistrer ton document au format UTF-8 sans BOM. C'est détaillé dans les tutos et tu n'as pas à utiliser utf8_decode/utf8_encode.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Ok !
    Désolé pour mon incompétence, j'ai suivi vos instructions et maintenant, ça marche !
    J'ai des données propres à l'écriture comme à la lecture.
    Merci beaucoup !

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par robinowned Voir le message
    Ok !
    Désolé pour mon incompétence, j'ai suivi vos instructions et maintenant, ça marche !
    J'ai des données propres à l'écriture comme à la lecture.
    Merci beaucoup !
    Parfait, tu vois qu'il vaut souvent mieux investir dans un peu de lecture pour se documenter, plutôt que d'essayer des trucs à l'arrache qui parfois posent autant de problèmes qu'ils en résolvent

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

Discussions similaires

  1. [Encodage] [Html/CSS] Problème d'accents dans les mails Outlook 2007
    Par Rayek dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 27/07/2011, 17h03
  2. [XML] encodage accents pour lecture en html/php
    Par argonath dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/10/2009, 17h24
  3. [XSL]problème de l'encodage de sortie HTML
    Par portu dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/03/2009, 09h53
  4. [XSLT] problème d'accent pour HTML
    Par best94 dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 01/08/2008, 14h55
  5. [HTML/Object] Problème superposition calques (tag <object
    Par busmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/11/2005, 11h02

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