Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoyer un texte par méthode POST avec AJAX

Sujet résolu
    9 janvier 2011 à 0:03:02

    Salut tout le monde,
    j'ai un souci plutôt commun on va dire mais rien de ce que j'ai trouvé sur le net ne fonctionne. Et même si c'était le cas, j'aimerais bien comprendre en détails le fonctionnement (pour repérer les problème potentiels de sécurité).

    Donc je vous raconte : j'ai un formulaire HTML tout simple (la page JS contenant modTexteDefilant() est incluse évidemment) :
    <textarea id="texteDefilant" rows="3" cols="30"></textarea>
    <input type="button" value="OK" onclick="modTexteDefilant(document.getElementById('texteDefilant').value);">
    

    Quand je clique sur le bouton OK, je lance la fonction modTexteDefilant() avec le contenu du textarea comme seul argument.

    Voici la fonction modTexteDefilant() en question :
    function modTexteDefilant(texte){
    	alert(texte); //ici pour vérifier qu'il n'y a pas d'erreur dans la fonction et qu'elle marche
    	xmlhttp = new XMLHttpRequest();
    	xmlhttp.open("POST", "admin-texte-defilant.php", true);
    	xmlhttp.onreadystatechange=function() {
    		if (xmlhttp.readyState==4 && xmlhttp.status==200) {
    			alert(xmlhttp.responseText);//affiche le retour
    		}
    	}
    	xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');//pour que ca marche avec des variables POST
    	xmlhttp.send("texteDefilant="+encodeURIComponent(texte));
    }
    

    Et enfin voici la page admin-texte-defilant.php ($DB_ACCESS est un objet qui contient un objet PDO et agit tout comme en gros) :
    <?php $message = str_replace(chr(10),' ',$_POST['texteDefilant']);//on remplace les retours à la ligne par un espace
    $retour = $DB_ACCESS->exec("UPDATE table SET texte='".$message."' WHERE id='1'");
    if ($retour===FALSE)
    	echo"ERR: ". $DB_ACCESS->errorInfo();
    else
    	echo $message;
    ?>
    


    Mon problème : tout va bien tant que j'utilise des caractères non spéciaux. Dès qu'il y a une apostrophe ça foire mais pour ça, addslashes fais l'affaire. Si je mets un & dans mon texte, ça foire (du coté JS apparemment, il doit penser que ce qui suit est une nouvelle variable). J'ai donc essayé côté JS encodeURI() au lieu de encodeURIComponent() mais non...
    Du côté php, avant addslashes(), j'avais utilisé mysql_real_escape_string() comme suit :
    <?php $message = mysql_real_escape_string(str_replace(chr(10),' ',$_POST['texteDefilant']));//on remplace les retours à la ligne par un espace
    $retour = $DB_ACCESS->exec("UPDATE table SET texte='".$message."' WHERE id='1'");
    if ($retour===FALSE)
    	echo"ERR: ". $DB_ACCESS->errorInfo();
    else
    	echo $message;
    ?>
    

    Mais dans ce cas, l'alerte JS qui affiche le retour affichait une boite vide... Et le champ "texte" dans la table est vidé. Et apparrement du côté de la requête à la base, il n'y pas de souci puisque $retour n'est pas FALSE... C'est comme si mysql_real_escape_string($var) retournait une chaine vide.

    Donc pour résumer, j'aimerais encoder le texte du côté JS quelque soit les caractères qu'il contient et du côté PHP, pouvoir insérer mon texte en tout sécurité. Avez-vous une aide ?

    Merci d'avance pour votre aide. :D
    • Partager sur Facebook
    • Partager sur Twitter
    "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
      9 janvier 2011 à 0:33:18

      encodeURIComponent encode tous les caractères problématiques.

      Donc à priori tu as plus un problème de PHP.
      • Partager sur Facebook
      • Partager sur Twitter
        9 janvier 2011 à 0:54:28

        Euh pas que, quand j'envoie le texte "l'annonce & voila", du coté de PHP, la variable POST['texteDefilant'] ne contient que "l'annonce " même avec encodeURIComponent...

        EDIT :
        alors j'ai trouvé comment résoudre mon souci en partie grâce à toi. En effet encodeURIComponent() encode bien TOUS les caractères. Le problème venait de mysql_real_escape_string() qui ne fonctionne qu'avec une connexion mysql_connect() et pas PDO... Avec PDO il faut la remplacer par PDO::quote() et dans la requete elle-meme, il faut pas mettre d'apostrophe pour texte=tatata.

        Voili voilou, si d'autres on ce genre de souci, j'espère que ça les aidera.
        • Partager sur Facebook
        • Partager sur Twitter
        "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
          9 janvier 2011 à 12:49:17

          Marque le sujet en résolu, si c'est bon.
          • Partager sur Facebook
          • Partager sur Twitter

          Envoyer un texte par méthode POST avec AJAX

          × 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