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 :

UTF8 quand tu nous tiens


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut UTF8 quand tu nous tiens
    Bonjour à tous

    Bon je doit pas être le premier ni le dernier à avoir ce problème !

    J'ai un site en UTF8, ma base en UTF8, les tables en UTF8 ect.. mais rien à faire, dans ma base de données j'ai des é a la place des é etc...alors que normalement je devrais bien avoir un é, à etc...

    Avant que vous me demandez j'ai bien ceci dans mon header:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    Connexion base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $this->query("SET NAMES 'utf8'", $this->link_id);
              $this->query("SET CHARACTER SET 'utf8'", $this->link_id);
    		  $this->query("SET CHARACTER_SET_CONNECTION=utf8", $this->link_id);
    Dans mon htaccess:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddDefaultCharset utf-8

    Je ne voie vraiment plus d'ou vient le problème là , si vous avez une idée je suis super preneur !

    D'avance merci

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    je suis pas un pro sur l'encodage, mais il me semble que tu as des caractères html à la place. Utilises html_entity_decode avant de mettre en base de données.
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Bonjour Fench

    J'ai essayer direct ta solution mais non toujours pas hélas

    Je prend cette phrase comme exemple: J'ai testé

    Avant le html_entity_decode cela me donner ceci en base :

    Et maintenant avec le html_entity_decode sa me donne:

    Le é et même barrer

    Franchement je désespère, j'arrive pas à trouver le problème !

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par zoulou172 Voir le message
    je ne voie vraiment plus d'ou vient le problème là , si vous avez une idée je suis super preneur !
    Trace ton code d'insertion en base et retire le htmlentities() qui doit sévir.
    La base de données ne remplace rien d'elle-même

  5. #5
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Comme je te l'ai dis, je suis pas trop doué alors je vais essayer des pistes:
    Tu as dans ta ligne du code Html comme &eacute; et du code iso comme &#039;

    Ce que je ne comprends pas c'est que le ' de j'ai correspond à #130;
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Re bonjour !

    J'ai de la news, depuis un moment je me demande pas si sa vient pas des filtres en faite...

    Filtres qui sont tirés par un CMS en faite

    Avant l'insertion dans la base j'ai ce filtre function filtre():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     $string = filter_var($string, FILTER_SANITIZE_STRING);
          $string = trim($string);
          $string = stripslashes($string);
          $string = strip_tags($string);
          $string = str_replace(array('‘', '’', '“', '”'), array("'", "'", '"', '"'), $string);
    J'ai aussi une class final donc je met le code entier:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
      final class Filter
      {
          public $get = array();
          public $post = array();
          public $cookie = array();
          public $files = array();
          public $server = array();
     
     
          /**
           * Filter::__construct()
           * 
           * @return
           */
          public function __construct()
          {
              $_GET = $this->clean($_GET);
              $_POST = $this->clean($_POST);
              $_COOKIE = $this->clean($_COOKIE);
              $_FILES = $this->clean($_FILES);
              $_SERVER = $this->clean($_SERVER);
     
              $this->get = $_GET;
              $this->post = $_POST;
              $this->cookie = $_COOKIE;
              $this->files = $_FILES;
              $this->server = $_SERVER;
          }
     
          /**
           * Filter::clean()
           * 
           * @param mixed $data
           * @return
           */
          public function clean($data)
          {
              if (is_array($data)) {
                  foreach ($data as $key => $value) {
                      unset($data[$key]);
     
                      $data[$this->clean($key)] = $this->clean($value);
                  }
              } else
                  $data = htmlentities($data, ENT_QUOTES, 'UTF-8');
     
              return $data;
          }
      }
    Alors je vient de faire ceci en faite, enlever ma function filtre de ma variable et aussi faire un simple return $data dans la class final comme ceci:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
      final class Filter
      {
          public $get = array();
          public $post = array();
          public $cookie = array();
          public $files = array();
          public $server = array();
     
     
          /**
           * Filter::__construct()
           * 
           * @return
           */
          public function __construct()
          {
              $_GET = $this->clean($_GET);
              $_POST = $this->clean($_POST);
              $_COOKIE = $this->clean($_COOKIE);
              $_FILES = $this->clean($_FILES);
              $_SERVER = $this->clean($_SERVER);
     
              $this->get = $_GET;
              $this->post = $_POST;
              $this->cookie = $_COOKIE;
              $this->files = $_FILES;
              $this->server = $_SERVER;
          }
     
          /**
           * Filter::clean()
           * 
           * @param mixed $data
           * @return
           */
          public function clean($data)
          {
     
     
              return $data;
          }
      }
    Et là j'ai bien "j'ai testé" en base, mais bon d'ou vient le problème docteur ?

    Merci pour votre aide

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par zoulou172 Voir le message
    Et là j'ai bien "j'ai testé" en base, mais bon d'ou vient le problème docteur ?
    Il vient du fait que ton CMS fait un peu n'importe quoi avec les données reçues. Il est parano et du coup crée plus de problèmes qu'il n'en résout :
    Ta classe filtre passe tout à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data = htmlentities($data, ENT_QUOTES, 'UTF-8');
    Ensuite, il y a un autre problème beaucoup plus sérieux, c'est que ton CMS casse les chaînes textes :
    Les fonctions str_* ne sont pas compatibles avec UTF-8. La seule qui le soit sans risque c'est trim()Alors quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = str_replace(array('‘', '’', '“', '”'), array("'", "'", '"', '"'), $string);
    Tu as une probabilité non négligeable de corrompre ta chaine.

    Change de CMS.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci rawsrc pour tes conseils !!!

    Je vient de faire ceci déjà:

    Enlever:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $string = filter_var($string, FILTER_SANITIZE_STRING);
    Car lui aussi je me suis informer sur php.net fou le bordel...

    J'ai aussi enlever:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $data = htmlentities($data, ENT_QUOTES, 'UTF-8');
    Et remplacer tout simplement par un $data = $data (lol)

    Tu en pense quoi ? je vient de d'insérer un "j'ai élevé <b>lol</b>" j'ai bien dans ma base la même phrase sans les tags <b> car j'ai quand même toujours le strip_tags dans mon filtre..

    Pour le reste str_replace je sais pas trop quoi faire en faite maintenant, mais mon site est écrit par moi même sinon, juste quelques functions pris à droite à gauche.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    J'ai mis un htmlspecialchars() à la place du htmlentites pour infos

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Allez on va reprendre :

    Tu es en UTF-8 :
    Pour sécuriser l'affichage dans le navigateur : c'est htmlspecialchars(ENT_QUOTES)
    Pour sécuriser les entrées en base de données c'est $stmt = $pdo->prepare(sql);.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
    echo $hsc($variable);
    Ensuite pour éviter les attaques sournoises liées aux bordel des encodages : j'utilise ceci qui me certifie que je n'ai à faire qu'à de l'utf-8 :
    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
    protected function multibyteStringProtection()
        {
            $protect = function($p) { return mb_convert_encoding($p, 'UTF-8', 'UTF-8'); };
     
            if (isset($_GET)){
                array_walk_recursive($_GET, $protect);
            }
     
            if (isset($_POST)) {
                array_walk_recursive($_POST, $protect);
            }
     
            if (isset($_REQUEST)) {
                array_walk_recursive($_REQUEST, $protect);
            }
     
            if (isset($_COOKIE)) {
                array_walk_recursive($_COOKIE, $protect);
            }
        }
    Le strip_tags() est plus embêtant qu'autre chose dans la mesure où si l'affichage est sécurisé : ce qui aura été saisi même avec des tags, sortira &lt;b&gt;lol&lt;b&gt; et ne pourra être interprété par le navigateur.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Septembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Re

    Je prend note, super intéressent tes conseils ! pour mon prochain projet je partirais sur cette base, et utiliser la pdo également que je n'utilise toujours pas...

    Je pense que mon message pourras aider quelques uns, ont en voient souvent traiter ce problème, genre quel filtre avant l'insertion, quel filtre à l'affichage etc... moi le premier je mis perd, car il y a tellement de functions !!!!

    Merci pour votre aide, je met le sjet sur Résolu

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

Discussions similaires

  1. [AJAX] Ajax quand tu nous tiens
    Par Florent08800 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/08/2007, 21h38
  2. [FRAME] Quand tu nous tiens
    Par hisy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/07/2006, 08h27
  3. [Sessions] Session quand tu nous tiens
    Par arti2004 dans le forum Langage
    Réponses: 10
    Dernier message: 27/05/2006, 19h19
  4. Regex quand tu nous tiens !!!
    Par calimero642 dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 14h33
  5. [object HTMLSelectElement] IE quand tu nous tiens
    Par NeHuS dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2006, 08h26

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