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

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2013
    Messages : 5
    Points : 4
    Points
    4

    Par défaut Encodage des lettres accentuées

    Bonjour,

    J'ai récemment reprise un code "Ajax" utilisant les requêtes XHLHttpRequest() pour vérifier la validité de quelques champs de saisi d'un formulaire.

    Jusqu'ici tout marche bien, les données envoyées sont bien reçu par les pages PHP qui traite ces derniers et renvois le résultat sous forme de chiffres (0, 1, 2 ...etc.) et la réponse au client est affichée selon le résultat renvoyé.

    Malheureusement, j'ai un soucis d'encodage avec les lettres accentuées que mon code AJAX renvoi sous une autre forme, par exemple le mot étoile est renvoyé ainsi " %E9toile "(si je fait un echo pour voir comment est stocké la variable résultat).

    Sachant que toutes mes pages sont encodés sous "UTF-8" ainsi que ma base de données (utf8_unicode_ci).

    Ci-dessous les scripts :

    -------- AJAX -----------

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    ...
    function verifcodeq(codeq){
      if(typeof(codeq)!='undefined' && codeq!=null && codeq != '') {
        var codeqLen = codeq.length;
        console.log('codeqLen : ' + codeqLen);
        if(codeqLen < 5){
           writedivcodeq('<img border="0" src="../imgs/form_warning.png" width="20" height="20" alt="PAS OK" title="PAS OK">');
    	   checkResponse3 = false;
        } else {
          file('./run.exe/?vr=CODEQ',escape(codeq),function(response3){
    	  console.log("response3" , response3);
    	  if(response3 == 1){
    		writedivcodeq('<img border="0" src="../imgs/form_ok.png" width="20" height="20" alt="OK" title="OK">');
    		checkResponse3 = true;
    	  } else if(response3 == 2){
    		writedivcodeq('<img border="0" src="../imgs/form_warning.png" width="20" height="20" alt="PAS OK" title="PAS OK">');
    		checkResponse3 = false;
    	  } else {
    		console.log("Valeur inconnue !");
    		writedivcodeq('');
    	  }
    	  checkCheck(); //on vérifie l'état des réponses 
    	 });
        }
    	checkCheck(); //on vérifie l'état des réponses
      } else {
    	writedivcodeq('');
     }
    }
     
    function file(url,codeq, callBack) {
        var data ='codeq='+escape(codeq);
        var result = postAjax(url,data,callBack);
        return result;
     }
     
    /**
    * Retourne l'objet xhr
    */     
    function getXhr(){
      var xhr = null;
        try{
          if( typeof ActiveXObject == 'function' ){
              xhr = new ActiveXObject("Microsoft.XMLHTTP");
          } else {
            if( window.XMLHttpRequest ){
              xhr = new XMLHttpRequest();
            }
          }
        } catch(e) {
          alert(e.message);
          return null;
        }
      return xhr;
    }
     
    /**
    * Ajax : POST
    */
    function postAjax(url,data,callBack){
      var xhr = getXhr();
      xhr.open('POST', url, true);
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
      xhr.onreadystatechange = function() {
        if(this.readyState == 4){
          console.log('status', xhr.status);
          console.log('DONE', xhr);
          if(xhr.status == 200){
            console.log('responseText',xhr.responseText);
            callBack(xhr.responseText);
          }else{
            //error
            alert('Erreur !' + xhr.status + " -> " + xhr.responseText); 
          }
        }
      };
      xhr.send(data);
    }
    -------- PHP -------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
     
    $codeq=$_POST["codeq"];
     
    $result="SELECT * FROM table WHERE codeq='$codeq'";
     
    echo $result;
     
    ?>
    ------- IMAGE Résultat console Web ----------

    Nom : ajax.png
Affichages : 28
Taille : 69,0 Ko

    -----------------------------------------------

    1) Est-ce que je dois configurer par moi même l'encodage du code AJAX ?
    2) Comment faire pour récupérer les lettres accentuées pour que mes requêtes PHP s'exécutent convenablement ?


    Merci d'avance pour vos solutions

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 987
    Points : 6 475
    Points
    6 475

    Par défaut

    Tu utilises escape(), dont l’effet est précisément de transformer "é" en "%E9". Donc dès le départ, ton objet XMLHttpRequest envoie "%E9", ton serveur reçoit "%E9", et ton serveur renvoie "%E9".

    Laisse XMLHttpRequest encoder lui-même les données, il se débrouille très bien tout seul

    Note : escape() est dépréciée, à la place il est conseillé d’utiliser encodeURIComponent().
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2013
    Messages : 5
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    Merci beaucoup pour votre réponse cela a réglé une partie de mon problème

    en effet les lettres accentué ne sont plus codé mais la requête SQL ne s'exécute pas correctement.

    J'ai zéro résultat lorsque je tape un mot clé avec une lettre accentué alors que ce mot clé existe dans ma base de données.

    Mais lorsque je tape un mot clé ne comportant aucune lettre accentué et qui existe dans ma base de donnée, là oui j'ai un retour positif et cohérent.

    Quel est le problème ?

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 987
    Points : 6 475
    Points
    6 475

    Par défaut

    Peut-être parce que ta table contient des "%E9" et non pas des "é" ?
    Vérifie avec une requête SELECT codeq FROM table (sans WHERE).
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2013
    Messages : 5
    Points : 4
    Points
    4

    Par défaut

    même résultat malheureusement, toujours que lorsqu'il y a une lettre accentué ou plus.

    ---------- TABLE users -----------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    id  |  nom  |  Prenom  |  login  |  mdp  |  reponse   |
    --------------------------------------------------
    1   |  Jean  |  Yves     |  jean  |  123  |  étoile       |
    --------------------------------------------------
    2   |  albert |  breton  |  albert|  456  |  nouilles     |
    --------------------------------------------------
    ---------- CODE PHP -----------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     
    $reponse=rawurldecode($_POST["reponse"]);
    $select_reponse=mysql_query("SELECT * FROM users WHERE reponse='$reponse'");
     
    $verifier_reponse=mysql_num_rows($select_reponse);
     
    echo $verifier_reponse;
     
    ?>
    Biensur j'ai remplacé escape() par encodeURIComponent() comme vous me l'aviez suggéré et ça marche bien


    lorsqu'on va sur la console web de firefox avec le mot clé "étoile" pour voir le résultat, au lieu d'avoir "1" résultat trouvé il affiche "0"

    mais si on fait une recherche avec le mot clé "nouilles" il affiche "1" résultat trouvé.

    Donc j'ai constaté que les mots clé comportant au moins une lettre accentué ou un caractère spécial il affiche directement "zéro" résultat.


    Merci encore pour ton aide précieuse, j'essaie de trouvé une solution sur le NET mais j'y arrive pas

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 987
    Points : 6 475
    Points
    6 475

    Par défaut

    Je vois que tu utilises la vieille API mysql_. Si ton serveur passe à PHP 7, tu ne pourras plus utiliser cette API. Pense à te mettre à jour

    Dans le code que tu montres, tu ne paramètres pas l’encodage de communication entre PHP et la base de données. Peux-tu essayer mysql_set_charset() et me dire si ça change quelque chose ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mysql_set_charset('utf8'); // ou 'utf8mb4'
    $select_reponse = mysql_query( ... );
    Important : si tu as entendu parler de SET NAMES, c’est une méthode incorrecte, il ne faut pas l’utiliser.

    Essaye aussi ces requêtes :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM users WHERE reponse='%E9toile'
    SELECT * FROM users WHERE reponse='étoile'
    SELECT * FROM users WHERE reponse='%C3%A9toile'

    À propos de encodeURIComponent(), je me suis mal exprimé : je voulais dire que cette fonction est à préférer à escape(), mais en l’occurence tu n’as besoin d’aucune des deux puisque, comme je l’ai dit, XMLHttpRequest gère l’encodage lui-même. D’ailleurs, une chose à savoir est qu’ajax utilise toujours UTF-8 pour encoder les données envoyées vers le serveur.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2013
    Messages : 5
    Points : 4
    Points
    4

    Par défaut

    ça marche trop bien avec mysql_set_charset('utf8');

    Merci beaucoup Watilin t'es un AS

    je vais me mettre à jour côté PHP, je me suis documenté et c'est vrai qu'avec cette dernière je vais pouvoir éviter pas mal de problèmes


    Merci encore pour ton aide

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

Discussions similaires

  1. Codage des lettres accentuées
    Par namstou3 dans le forum Fichiers
    Réponses: 16
    Dernier message: 21/11/2007, 18h13
  2. Encodage des lettres arabes
    Par bailamos dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2007, 00h23
  3. ResourceBundle et encodage des lettres acentuées
    Par rozwel dans le forum Général Java
    Réponses: 8
    Dernier message: 17/09/2006, 23h30
  4. Récupération des lettres accentuées
    Par troumad dans le forum Installation
    Réponses: 5
    Dernier message: 15/11/2005, 21h28
  5. Comment entrer des lettres accentuées sous postgresql ?
    Par Chihuahua dans le forum Requêtes
    Réponses: 11
    Dernier message: 28/08/2003, 08h04

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