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

AJAX Discussion :

[AJAX] Caractères spéciaux et enregistrement dans base SQL


Sujet :

AJAX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Infographiste, webdevelopper, consultant en communication, bidouilleur sur Macintosh
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, webdevelopper, consultant en communication, bidouilleur sur Macintosh
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut [AJAX] Caractères spéciaux et enregistrement dans base SQL
    Bonjour.

    Je cherche à enregistrer une chaine de caractères contenue dans un DIV contenteditable dans une base SQL. Cela fonctionne correctement sauf quand cette chaine comporte les caractères ">", "<" et "&".

    Voici une portion de mon code html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!DOCTYPE html>
    <html>
         <head>
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
              etc...
         </head>
     
         <body>
              <input type="image" onclick="save();" src="./image/save.png" />
              <div id="texte" contentEditable ></div>
              etc...
         </body>
    </html>
    Voici mon code JAVASCRIPT qui correspond à la fonction "save();" :
    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
    // reponse XHR et affichage du contenu du Div
    function traitementSave() {
        if(objetXHR50.readyState==4) {
            if(objetXHR50.status==200) {
                alert ("Sauvegarde OK");
            }
        }
    }
     
    // lien avec le fichier PHP
    function save() {
        var texte = document.getElementById("texte").innerHTML;
        var parametres = "texte="+texte;
        objetXHR50 = creationXHR();
        objetXHR50.onreadystatechange = traitementSave;
        objetXHR50.open("post","./save.php",true);
        objetXHR50.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        objetXHR50.send(parametres);
    }
    Voici une portion de mon code PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte = $_POST['texte'];
    mysql_query (" INSERT INTO maTable (texte) VALUES ('$texte') ");
    Donc, comme je le disais, si je saisie "Tout va bien dans le meilleur des mondes !", l'enregistrement s'effectue correctement dans ma base de donnée.

    Si je saisie "Le chiffre 7 > 3", l'enregistrement retourné est "Le chiffre 7".

    Pour mon code PHP, j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte = htmlspecialchars($_POST['texte']);
    mysql_query (" INSERT INTO maTable (texte) VALUES ('$texte') ");
    Mais malheureusement, l'enregistrement dans la base est bloqué au caractère ">".

    Dernières précisions :
    - Grâce à la commande "execCommande", j'insère du style dans mon DIV (exemple : <span style="font-weight: bold;">mon texte</span>) et ça fonctionne.
    - J'ai essayé de créer un bouton permettant d'insérer le code ASCII ou le code HTML du caractère "&" et ainsi obtenir (exemple : mon texte &amp; un autre texte) ou (exemple : mon texte &#38; un autre texte)

    Ceci n'a pas réglé mon problème...

    Quelqu'un peut-il m'aider svp ?

  2. #2
    Membre confirmé Avatar de zulad
    Homme Profil pro
    creatif
    Inscrit en
    Juin 2007
    Messages
    713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : creatif

    Informations forums :
    Inscription : Juin 2007
    Messages : 713
    Points : 519
    Points
    519
    Par défaut
    Salut, pour les changements de caractère spéciaux il vaut mieux faire une table de mapping coté Javascript ou PHP. Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    $in = [ ">" => "&gt;", "<" => "&lt;", ... ];
    $out = [ "&gt;" => ">", "&lt;" => "<", ... ];
     
    $out["&gt;"] // <-- ">"
    Javascript c'est du .replace...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Infographiste, webdevelopper, consultant en communication, bidouilleur sur Macintosh
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, webdevelopper, consultant en communication, bidouilleur sur Macintosh
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Bonjour

    Côté JAVASCRIPT, j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function save() {
        var texte = document.getElementById("texte").innerHTML;
        texte = texte.replace(/&/g, "&amp;" );
        texte = texte.replace(/</g, "&lt;" );
        texte = texte.replace(/>/g, "&gt;" );
     
        var parametres = "texte="+texte;
        objetXHR50 = creationXHR();
        objetXHR50.onreadystatechange = traitementSave;
        objetXHR50.open("post","./save.php",true);
        objetXHR50.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        objetXHR50.send(parametres);
    }
    Là encore, le problème reste le même. L'enregistrement dans la base SQL est bloqué par l'un de ces trois caractères...

    Je suis en train de me dire que je vais régler le problème en remplaçant ces caractères par des images. Au moins, je n'aurai pas ce genre de mésaventure...

    Une autre idée ?

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Aucun besoin de transformer les caractères spéciaux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte = encodeURIComponent(text);

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    +1 Ton $_POST fait déjà le boulot.

    Après il y a une histoire de magic_quote activé ou pas. Le mieux est de désactiver (s'il l'est sur ton serveur) et de passer un coup de mysql_respace_string() sur ton $_POST avant de l'insérer dans la BDD.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Infographiste, webdevelopper, consultant en communication, bidouilleur sur Macintosh
    Inscrit en
    Septembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, webdevelopper, consultant en communication, bidouilleur sur Macintosh
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    J'ai testé "encodeURIComponent" et, en effet, tout fonctionne correctement. Merci à toi, Bovino, pour cette réponse qui m'aide énormément.

    Malgré tout et ce, pour ma culture générale, peux tu m'expliquer pourquoi dans une chaine de caractère de ce type : <span style="font-weight: bold;">Texte en gras > (supérieur) </span>texte normal...
    L'encodage grace à la fonction encodeURIComponent converti cette chaine de cette manière : <span style="font-weight: bold;">Texte en gras &gt; (supérieur) </span>texte normal...
    Je ne comprends pas pourquoi ce signe n'est pas converti dans "</span>" par exemple.

    Quoiqu'il en soit, même si je ne comprends pas pourquoi, cela m'arrange bien .

    Enfin, Bob633, je vais tester ta solution et posterai un petit message pour donner mes conclusions.

    Merci à vous deux.

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Salut,

    je pense que tu confonds avec autre chose. encodeURIComponent, c'est du JavaScript, et ça convertit tous les caractères qui ont un sens spécial dans une URI, entre autres <, >, ", : et les espaces. Le caractère encodé est représenté par un % et deux chiffres hexa, par exemple %3A.

    Quelques idées d'ordre plus général : il y a deux principes à respecter si on veut éviter les complications :
    1. Ne jamais faire confiance aux données provenant du client. N'importe quel lamer peut crafter une requête Ajax avec Firebug depuis tes pages web, ton serveur ne verra pas la différence. C'est ton serveur PHP qui doit transformer les données.
    2. Toujours stocker du contenu « sain » dans ta base de données, autrement dit transformer les chaînes, et notamment échapper le HTML, avant de faire INSERT. C'est bon pour les performances du serveur, car le filtrage sera fait seulement au moment du stockage, et pas à la lecture. Si besoin, prévoir un script CLI pour vérifier / nettoyer le contenu de la base en cas de doute.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/12/2010, 17h02
  2. Mise à jour enregistrement dans base SQL Server
    Par bouquenom dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/06/2010, 10h03
  3. caractère spéciaux sous IE dans de l'AJAX
    Par bb62 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/04/2008, 12h01
  4. Réponses: 8
    Dernier message: 29/10/2007, 17h52
  5. nbre enregistrements dans base de données
    Par Chonchon dans le forum JDBC
    Réponses: 3
    Dernier message: 09/01/2006, 20h54

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