Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème encodage UTF-8 base de données MySQL

Sujet résolu
    13 août 2012 à 14:29:05

    Bonjour,

    Je viens de passer ma base de données ainsi que mon site en UFT-8. Tout fonctionne très bien, sauf le contenu de ma base données : les caractères spéciaux laissent place à des �.

    J'ai essayé plusieurs techniques différentes pour palier à ce problème tels que mysql_set_charset("UTF8"); (je n'utilise pas PDO), mais sans succès.

    Voici un exemple de table qui se trouve dans la BDD :
    CREATE TABLE IF NOT EXISTS `creations` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(255) NOT NULL,
      `url` varchar(63) NOT NULL,
      `etat` varchar(21) NOT NULL,
      `contenu` text NOT NULL,
      `debut` bigint(20) NOT NULL,
      `fin` bigint(20) NOT NULL,
      `nbr_img` varchar(1) NOT NULL,
      `tags` text NOT NULL,
      KEY `id` (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
    
    INSERT INTO `creations` (`id`, `nom`, `url`, `etat`, `contenu`, `debut`, `fin`, `nbr_img`, `tags`) VALUES
    (1, 'OpenSearch LinkPush', '/LinkPush', 'fini', 'Cet OpenSearch vous permet d''envoyer directement un lien depuis votre ordinateur (via la barre de recherche de votre navigateur) à votre téléphone Android. Vous devez d''abord installer l''application <a href="http://linkpush.appspot.com/">LinkPush</a> sur votre mobile avant de pouvoir l''utiliser.', 1279226607, 1279227104, '0', 'OpenSearch, Android, LinkPush');
    


    Le code en question :
    <?php
    mysql_connect("SERVER", "USER", "PASSWORD");
    mysql_select_db("DB")
    $re = mysql_query('SELECT * FROM creations WHERE id=' . $_GET['id']);
    
    while($don = mysql_fetch_array($re))
    {
    	[...]
    	
    	echo nl2br(stripslashes($don['contenu']));
    }
    ?>
    


    Et la page en question : http://www.maxi-mang.biz.st/crea.php?id=1.

    Je n'ai pas trouvé de solution qui marche. Je ne sais plus quoi faire. C'est pourquoi je vous demande votre aide...

    Merci d'avance,
    Maxi-ManG
    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2012 à 14:41:32

      Ta page est bien en utf-8 ? Pour vérifier ouvre ta page avec notepadd++ (par exemple) et va dans le menu "encodage".
      Il te faut aussi le <meta charset="utf-8" /> dans ton <head>

      De plus, as-tu bien mit tes champs (dans ta table) en utf-8 également ?
      • Partager sur Facebook
      • Partager sur Twitter

      Développeur Web Freelance. Spécialiste Symfony et Laravel.

        13 août 2012 à 14:42:48

        Et tes pages elles sont en UTF8?

        Genre si tu utilises notepad++ il faut enregistrer les pages en UTF8

        EDIT :

        C'est forcément tespages qui ont eu un oublie d'encodage, vu que cette page http://www.maxi-mang.biz.st/new.php fonctionne très bien ;)
        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2012 à 14:45:17

          Bonjour,
          Tes chaînes de caractères dans ta base de données sont encodées en ISO-8859-1 (présence de �).
          Essayes de mettre un utf8_encode lors de l'affichage du contenu issu de ta base de données.
          Si cela fonctionne, applique cette fonction à toutes les données de ta base de données.
          • Partager sur Facebook
          • Partager sur Twitter
          Retrouvez moi sur Zeste de Savoir.
            13 août 2012 à 14:51:10

            Citation : YvanD

            Bonjour,
            Tes chaînes de caractères dans ta base de données sont encodées en ISO-8859-1 (présence de �).
            Essayes de mettre un utf8_encode lors de l'affichage du contenu issu de ta base de données.
            Si cela fonctionne, applique cette fonction à toutes les données de ta base de données.


            ... Si tu pars sur de bonnes bases niveau encodage (page, bdd, balise meta, etc...), aucune raison d'utiliser ces fonctions normalement.
            • Partager sur Facebook
            • Partager sur Twitter

            Développeur Web Freelance. Spécialiste Symfony et Laravel.

              13 août 2012 à 14:52:55

              C'est pas sa BDD à priorie puisqu'il a une seule page qui a un problème d'encodage, il a juste pas encoder cette page en UTF8, ou alors la table qui gère ça n'a pas eu d'encodage en UTF8
              • Partager sur Facebook
              • Partager sur Twitter
                13 août 2012 à 14:55:45

                Je code en xHTML. J'avais ajouté cette ligne dans le head :
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                


                J'ai bien converti toutes mes pages en UFT-8 (sans BOM) via Notepad++ avant de les mettre en ligne !

                utf8_encode marche. Le problème vient donc du contenu que j'ai entré dans la BDD ?!

                Et j'ai le même problème sur cette page : http://www.maxi-mang.biz.st/new.php?id=1.
                • Partager sur Facebook
                • Partager sur Twitter
                  13 août 2012 à 14:59:57

                  Edit ta news dans une page avec le bon encodage, et remplace les caractères foireux par les bons, ré-enregistre ta news et ça devrait fonctionner.

                  Ou modif directement dans ta BDD si tu n'as pas encore de page d'édition.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Développeur Web Freelance. Spécialiste Symfony et Laravel.

                    13 août 2012 à 15:09:45

                    Je n'ai pas encore de page d'édition. J'ai édité le contenu directement dans PMA, mais ça n'a rien changé. J'ai même copié les accents depuis une page encodée en UFT-8, toujours sans résultat.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 août 2012 à 15:13:39

                      Déjà essayé (comme indiqué dans le premier post) mais cela ne fonctionne pas.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 août 2012 à 15:19:20

                        Sauf que tu dois l'avoir (à l'insertion comme à la sélection)
                        Ça ne corrigera pas les anciennes données (mais il y a une procédure spécifique pour ça si tout le contenu actuel est touché en passant temporairement par un type binaire (blob) pour ensuite corriger le jeu sans reconversion)
                        Ça dépend si tu utilises des fonctions incompatibles côté PHP pour traitement avant l'insertion ou entre le select et l'affichage

                        PS : si t'as besoin de stripslashes, t'as un problème (double échappement à l'insertion ?)
                        PPS : t'as une injection
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 août 2012 à 15:26:29

                          Je l'ai depuis que j'ai débuté ce topic.

                          Je viens de tester en passant tout en blob, puis retour à la normal. Cela n'a pas fonctionné.

                          En l’occurrence, étant donné que je n'ai pas encore de page d'administration, je n'utilises aucunes fonctions à l'insertion, mais comme on peut le voir plus haut, j'utilise nl2br (pour les retour à la ligne) et stripslashes (je ne sais plus pourquoi ; question de sécurité à l'insertion ?!) lors de l'affichage.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 août 2012 à 15:29:31

                            Citation : maxi-mang

                            Je l'ai depuis que j'ai débuté ce topic.


                            Tu dis que tu l'as testé mais il n'est pas dans le code que tu montres. Si ta configuration par défaut de MySQL est sur le jeu latin1 alors que tu lui envoies de l'UTF-8, pour une colonne en UTF-8, il va te reconvertir ça n'importe comment (UTF-8 "encodé deux fois" donc c'est faux). Inversement, au SELECT, il va te reconvertir cet UTF-8 complètement foireux en CP1252.

                            Citation : maxi-mang

                            Je vais tester en passant tout en blob, puis retour à la normal.


                            Non, c'est pour corriger le jeu (si besoin). Données latin1 déclarées UTF-8 => blob => change le jeu pour latin1 (le jeu réel, il n'y a pas reconversion) => rechange le jeu pour UTF-8 et tout devrait être bon (les données sont reconverties de latin1/CP1252 en UTF-8 correctement).

                            Citation : maxi-mang

                            j'utilise nl2br (pour les retour à la ligne) et stripslashesc (je ne sais plus pourquoi ; question de sécurité à l'insertion ?!) lors de l'affichage.


                            nl2br ne pose pas de problème. stripslashes, en principe, n'a rien à faire là.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 août 2012 à 15:37:39

                              Tu as raison, j'ai ajouté le mysql_set_charset('utf8'); dans haut.php, mais la connexion à la BDD s'effectue directement depuis les deux pages concernées par le problème (new.php et crea.php) et je n'ai pas ajouté cette ligne dans ces fichiers.

                              Désolé pour le désagrément (j'ai commencé à me poser des questions quand les caractères spéciaux s'affichaient enfin correctement ici mais pas ) !

                              Merci à tout ceux qui m'ont aidé !


                              PS : J'ai viré stripslashes. Où se trouve l'injection (ça ne m'étonne même pas d'en avoir une) ?
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Problème encodage UTF-8 base de données MySQL

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown