Partage
  • Partager sur Facebook
  • Partager sur Twitter

BDD. Instruction d'encodage UTF8 avec PDO

Sujet résolu
    12 mars 2010 à 0:51:48

    Bonjour,
    Je me suis récemment mis à PHP et MYSQL, et avec les tutos je faisais les requêtes avec l'extension mysql_. Mon site fait une prise en charge multilingue, ce qui fait que je dois indiquer l'encodage UTF8 à la connexion à la BDD avec l'instruction :

    mysql_set_charset( 'utf8' );
    


    Cette instruction n'était pas dans les tutos que j'étudiais, mais je l'ai dénichée quelque part pour répondre à la nécessité de l'UTF8.

    Problème : les tutos du SdZ sur le PHP et MYSQL sont en chamboulement, et aux dernières nouvelles, il faut préférer l'extention PDO à mysql_. Mais alors dans ce cas, quelle est la nouvelle ligne d'instruction avec PDO qui fait la même chose que :

    mysql_set_charset( 'utf8' );
    
    ?

    • Partager sur Facebook
    • Partager sur Twitter
      12 mars 2010 à 1:00:34

      mysql_set_charset ne fait qu'envoyer une requête SQL au serveur, hein.
      Un coup sur la doc PHP:

      Citation

      SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'
      


      Si c'est pour passer à UTF-8 depuis ISO (ou autre) : http://tech-at-all.blogspot.com/2010/0 [...] t-le-web.html
      (ouais un peu de pub)
      • Partager sur Facebook
      • Partager sur Twitter
        12 mars 2010 à 2:22:55

        il est possible d'indiquer une requête que PDO devra exécuter à chaque connexion :
        <?php
        $mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
        

        SET NAMES utf8 étant l'équivalent de mysql_set_charset('utf8')
        • Partager sur Facebook
        • Partager sur Twitter
          12 mars 2010 à 13:07:54

          Citation : Cortexd

          il est possible d'indiquer une requête que PDO devra exécuter à chaque connexion :

          <?php
          $mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
          


          SET NAMES utf8 étant l'équivalent de mysql_set_charset('utf8')



          Merci Cortexd. Mais quand je fais ce que tu me dis, j'obtiens ce message d'erreur :

          Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 6


          Je pige que dalle dans cette affaire de Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' machin chose... :( Alors qu'est-ce qui ne va pas ?
          • Partager sur Facebook
          • Partager sur Twitter
            12 mars 2010 à 13:37:34

            Re,

            PDO ou le drivers MySQL n'est pas activé sur ta machine.

            ++
            • Partager sur Facebook
            • Partager sur Twitter
              12 mars 2010 à 18:21:38

              ça peut aussi venir d'un bug de certaines versions de PHP où cette constante n'est pas définie, il faut alors la remplacer par sa valeur (enfin pas sûr que ça fonctionne non plus :p ) :
              <?php
              $mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(1002 => 'SET NAMES utf8'));
              


              sinon au pire :
              <?php
              $mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '');
              
              $mysql->exec('SET NAMES utf8');
              
              • Partager sur Facebook
              • Partager sur Twitter
                12 mars 2010 à 19:38:59

                Ou si tu es administrateur de ton serveur SQL, éditer le fichier de config de façon à ce qu'il soit tout le temps en UTF-8 (cf. ma signature ^^)
                • Partager sur Facebook
                • Partager sur Twitter
                  12 mars 2010 à 22:10:52

                  Citation : Cortexd

                  ça peut aussi venir d'un bug de certaines versions de PHP où cette constante n'est pas définie, il faut alors la remplacer par sa valeur (enfin pas sûr que ça fonctionne non plus :p ) :

                  <?php
                  $mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(1002 => 'SET NAMES utf8'));
                  



                  sinon au pire :

                  <?php
                  $mysql = new PDO('mysql:host=localhost;dbname=test', 'root', '');
                  
                  $mysql->exec('SET NAMES utf8');
                  


                  Quant à la première solution, effectivement, ça ne marche pas. Ca me renvoie tout une tartine de messages (autant qu'il y a d'entrées dans ma table) du genre :

                  Notice: Undefined index: francais in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 30


                  Quant à la seconde, voici la récolte... :

                  Notice: Undefined variable: mysql in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 7
                  
                  Fatal error: Call to a member function exec() on a non-object in C:\wamp\www\essais.uuu\test_fr\config\config_termes.php on line 7


                  Je précise (pour Jordan)que la PDO est activée, suivant scrupuleusement les instructions du docteur M@teo... ;)

                  C'est donc peut-être une affaire de bug de mon PHP... :colere2: Je fais quoi alors dans ce cas ? :euh: Pour information, j'utilise WampServer 2.0...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mars 2010 à 22:16:28

                    Re,

                    Quel est le code que tu testes là ?

                    Le bug a été fixé que dans PHP 5.3.0...

                    ++
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mars 2010 à 22:35:04

                      Citation : jordan

                      Re,

                      Quel est le code que tu testes là ?

                      Le bug a été fixé que dans PHP 5.3.0...

                      ++



                      A ton souhait, beauté... ;) Voici donc le code demandé :

                      try
                      		{
                      			$bdd = new PDO('mysql:host=localhost;dbname=coursphp', 'root', '');// Connexion à MySQL
                      			//$mysql->exec('SET NAMES utf8');
                      
                      		}
                      		catch (Exception $e)
                      		{
                      				die('Erreur : ' . $e->getMessage());
                      		}
                      
                      	
                      	
                      	//mysql_set_charset( 'utf8' ); //Indication de l'encodage de MySQL
                      	//SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8';
                      

                      Le but est d'indiquer à la connexion à la BDD que l'encodage est UTF8.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 mars 2010 à 22:48:12

                        Citation : jordan

                        $bdd et non pas $mysql



                        C'est la variable que j'ai utilisée dans mon code, qui est d'ailleurs une application d'un exemple de tuto. Je pense que son emploi est cohérent. Si tu veux, je te donne le script en entier pour que tu l'analyses :

                        <?php
                        //Configuration des termes du verba pour la langue du site
                        
                                        try
                        		{
                        			$bdd = new PDO('mysql:host=localhost;dbname=coursphp', 'root', '');// Connexion à MySQL
                        			//$mysql->exec('SET NAMES utf8');
                        
                        		}
                        		catch (Exception $e)
                        		{
                        				die('Erreur : ' . $e->getMessage());
                        		}
                        	
                        	//mysql_set_charset( 'utf8' ); //Indication de l'encodage de MySQL
                        	//SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8';
                        		 
                        			 
                        	$reponse = $bdd->prepare('SELECT terme, verba, ? FROM essais_gloss') or die(print_r($bdd->errorInfo())); // Préparation de la requête 
                        	$reponse->execute(array ($langue_site)); // exécution de la requête
                        	 
                        	// On fait une boucle pour lister tout ce que contient la table :
                        	 
                        	 while ($liste_termes = $reponse->fetch())
                                {
                        	  	  
                        	  ${'v_' . $liste_termes['terme']} = $liste_termes['verba'];
                        	  ${$liste_termes['terme']} = $liste_termes[$langue_site];
                        	  /*echo ${'v_' . $liste_termes['terme']}. '<br />';
                        	  echo ${$liste_termes['terme']}. '<br /><br />';*/
                        	  
                        	} 
                        	
                        	$reponse->closeCursor(); // Termine le traitement de la requête
                        
                         ?>
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 mars 2010 à 22:58:51

                          <?php
                          //remplace
                          $mysql->exec('SET NAMES utf8');
                          //par
                          $bdd->exec('SET NAMES utf8');
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 mars 2010 à 23:42:20

                            Citation : Nami Doc

                            <?php
                            //remplace
                            $mysql->exec('SET NAMES utf8');
                            //par
                            $bdd->exec('SET NAMES utf8');
                            


                            Oops ! Tout bête... o_O Il m'avait échappé celui-là... :lol: C'est en fait ce que voulait dire Jordan... J'avais donc pas compris son très laconique : "$bdd et non pas $mysql". Mais pas trop bavarde la mec... ;) Merci pour tous.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 mars 2010 à 23:43:53

                              Oui, c'est ce que je voulais dire :D

                              Je suis devant la télé, j'aurai du prendre le temps de détailler :/ (ma télé est sur mon ordi)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 mars 2010 à 23:51:17

                                Citation : jordan

                                Oui, c'est ce que je voulais dire :D

                                Je suis devant la télé, j'aurai du prendre le temps de détailler :/ (ma télé est sur mon ordi)



                                OOOKK! :D Bonne nuit à toi...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 mars 2010 à 2:50:45

                                  Citation : firekraag

                                  Ou si tu es administrateur de ton serveur SQL, éditer le fichier de config de façon à ce qu'il soit tout le temps en UTF-8 (cf. ma signature ^^)


                                  ça ne changera rien, c'est le charset du client (PHP ici) qu'il faut mettre en UTF-8
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 avril 2012 à 20:26:27

                                    juste pour dire merci

                                    ça fait un moment que j'avais le même problème (je programme par intermittence selon mon temps libre) et je suis content de plus voir ces "?" :D
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 mai 2012 à 0:34:17

                                      Bonjour,

                                      je suis sur le même probleme, j'essaie de créer un flux rss avec des données de ma base SQL.

                                      Mon flux fonctionne mais sans mes variables. J'ai utilisé W3G pour tester mon code et c'est mon PDO qui apparament bug mais je ne sais pas ou. Est ce que vous auriez une idée de ou chercher ?


                                      $options = array(
                                      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                                      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                                      );

                                      $bdd = new PDO("mysql:host=sql1;dbname=NomBase", "Util.", "mdp", $options);


                                      $reponse = $bdd->query("SELECT * FROM allvotes ORDER BY timestamp_vote DESC LIMIT 0,5");
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Aymar
                                        31 juillet 2013 à 20:01:23

                                        Oui enfin !!! Des années que je bloque là dessus ;) Mer ci à tous !!!!
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Because i'm batman !!
                                          24 novembre 2014 à 13:27:30

                                          Merci le site du zéro mieux qu'un logiciel clé en main :)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Si vous ne réussissez pas du premier coup, appelez ça « version 1.0 ».
                                            9 septembre 2015 à 14:31:26

                                            Bonjour,

                                            Je déterre ce sujet pour savoir si il y a une différence entre déclarer l'utf-8 avec

                                            $bdd = new PDO('mysql:host=localhost;dbname=coursphp', 'root', '');// Connexion à MySQL
                                            $bdd->exec('SET NAMES utf8');

                                            ET

                                            $bdd = new PDO('mysql:host=localhost;dbname=coursphp;charset=UTF-8', 'root', '');// Connexion à MySQL en UTF-8
                                                        


                                            ????

                                            Merci pour vos réponses.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 septembre 2015 à 14:39:29

                                              La deuxième est fausse : c'est utf8 et non UTF-8 chez MySQL (cf SHOW CHARACTER SET;)

                                              Sinon, oui, la première pourrait théoriquement valoir des injections, je cite la doc de la fonction C mysql_real_escape_string utilisée derrière par PHP (d'autant que les requêtes préparées sont émulées par défaut par le pilote mysql) :

                                              If you must change the character set of the connection, use the mysql_set_character_set() function rather than executing a SET NAMES (or SET CHARACTER SET) statement. mysql_set_character_set() works like SET NAMES but also affects the character set used by mysql_real_escape_string(), which SET NAMES does not.

                                              Qui dit en clair de ne JAMAIS exécuter SET NAMES (à moins de ne pas avoir le choix - ie PHP < 5.3.6) en tant que requête puisque le client, n'ayant pas l'information, serait dès lors incapable de réaliser un échappement correct. Il faut passer par l'équivalent client, ici, le paramètre charset du DSN.

                                              Même si en pratique, ça ne doit concerner que les jeux de caractères asiatiques codés sur plusieurs octets (comme SJIS, BIG5 et GBK).

                                              -
                                              Edité par julp 9 septembre 2015 à 14:48:19

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 septembre 2015 à 15:05:44

                                                Oui exact c'est UTF8 et merci pour ces infos !
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                BDD. Instruction d'encodage UTF8 avec PDO

                                                × 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