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 :

Formulaire ajax : apostrophe et autres caractères spéciaux


Sujet :

AJAX

  1. #1
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut Formulaire ajax : apostrophe et autres caractères spéciaux
    Bonjour,

    Dans une page j'effectue un test de formulaire ajax pour ne recharger la page.
    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
     
    function test() {
    	var name = document.getElementById("name").value;
    	var email = document.getElementById("email").value;
            var contact = document.getElementById("contact").value;
     
    	// Returns successful data submission message when the entered information is stored in database.
    	var dataString = 'name1=' + name + '&email1=' + email + '&contact1=' + contact;
    	if (name == '' || email == '' || contact == '') {
    	alert("remplissez tous les champs...");
    	} else {
    	// AJAX  submit form.
    	$.ajax({
    	type: "POST",
    	url: "ajax_form.php",
    	data: dataString,
    	cache: false,
    	success: function(html) {
    	alert(html);
    	}
    	});
    	}
    	return false;
    	}
    Tout fonctionne, les données sont insérées dans la table, mais dès qu'un apostrophe ou un "&" est présent, l'insertion ne fonctionne plus.

    Existe-il une solution pour pallier à ce problème ? J'ai effectué plusieurs recherches et tests sans résultat... entre autre, j'ai aussi essayé decodeURIComponent
    https://www.sitepoint.com/jquery-decode-url-string/

    Merci d'avance pour votre réponse,

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ce n'est pas coder qu'il faut, mais ENcoder.


    Le codage se fait à la réception.

  3. #3
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Bonjour,

    j'ai aussi essayé mais ça ne donne rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var dataString = encodeURIComponent('name1=' + name + '&email1=' + email + '&contact1=' + contact);

  4. #4
    Invité
    Invité(e)
    Par défaut
    Où et à quel moment ça bloque ?
    • dans le JS avant ?
    • dans le fichier PHP ?
    • dans le JS au retour ?

    Mets des alert (ou console.log), teste le fichier PHP directement (sans passer par Ajax),...

  5. #5
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    j'ai un champ textarea si je saisis "du texte" puis submit là c'est bon....
    mais si je saisis par "c'est midi ça sent les pates à la tomates..." le c'est contient une apostrophe et donc rien ne s'enregistre...

  6. #6
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    C'est pas le code JS qui en est responsable c'est PHP ou MYSQL, la page *.php qui reçoit le POST du formulaire doit être posté ici, donc sans ton PHP, tu n'obtiendra pas une aide efficace.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 383
    Points : 10 411
    Points
    10 411
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var dataString = 'name1=' + encodeURIComponent(name) + '&email1=' + encodeURIComponent(email) + '&contact1=' + encodeURIComponent(contact);
    EDIT : Etant donné que tu utilise jquery, autant en profiter :
    var name = document.getElementById("name").value; peut être remplacé par var name = $("#name").val();

    Aussi si tu veux collecter les input d'un formulaire, jQuery propose la fonction serialize(), avec une variante serializeArray() qui supporte les input avec notation tableau. Avec une seule commande tu peux donc collecter et encoder tous les input d'un formulaire et les données sont automatiquement protégées avec encodeURIComponent.

  8. #8
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Merci pour ces informations, effectivement il s'agit d'un problème PHP qui au premier abord semble être un soucis d'encodage Ajax,

    Citation Envoyé par headmax Voir le message
    C'est pas le code JS qui en est responsable c'est PHP ou MYSQL, la page *.php qui reçoit le POST du formulaire doit être posté ici, donc sans ton PHP, tu n'obtiendra pas une aide efficace.
    Ci-dessous la partie contenue dans ajax_form.php

    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
    <?php
    
    function flashentities($string){ 
    return str_replace(array("&","'"),array("%26","%27"),$string); 
    } 
    
    $name2 = $_POST['name1'];
    $email2 = $_POST['email1'];
    $contact2 = flashentities($_POST['contact1']); 
    $connection = mysql_connect("localhost", "root", "");
    $db = mysql_select_db("bdd", $connection); 
    if (isset($_POST['name1'])) {
    $query = mysql_query("insert into form_element(name, email, contact) values ('$name2', '$email2', '$contact2')");
    echo "insert ok";
    }
    //mysql_close($connection); 
    ?>
    Je ne suis pas sûr de m'y prendre de la bonne manière, certains caractères "&" posent problème.....

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 383
    Points : 10 411
    Points
    10 411
    Par défaut
    Ah effectivement c'est pas la grande forme côté php.

    Pour récupérer avec php des variables envoyées en ajax avec encodeURIComponent il faut utiliser urldecode.
    $name2 = urldecode($_POST['name1']);

    Et plus embêtant mysql est déprécié il faut utiliser mysqli ou pdo. Ensuite excepté si tu utilise des requêtes préparées, il faut utiliser une fonction pour protéger tes variables comme mysqli_real_escape_string pour mysqli.
    Mais pour un nouveau projet il vaut mieux utiliser pdo qui est le standard actuel. mysqli est surtout conçu pour maintenir à jour d'anciens projets qui utilisaient mysql.

  10. #10
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Pour ce qui est des problèmes liés au quôte récupérer dans les formulaires, il faut "checker" a deux niveaux :

    Comme dit @ABCIWEB au niveau PHP il faut utiliser des filtres notamment celui pour préparer les requêtes MYSQL, on aurait du utiliser PDO qui est plus sécurisé a ce niveau.
    MYSQL il faut paramétrer ta base de donnée si c'est pas déjà fait en UTF8 Général ci, afin de convertir en utf8 les données stocké en base lors des INSERT UPDATE ... se qui évite les problèmes liées aux quotes car se retrouvent convertir en une chaine unicode ... etc


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    $name2 =  mysql_real_escape_string($_POST['name1']);
    $email2 =  mysql_real_escape_string($_POST['email1']);
    $contact2 =  mysql_real_escape_string($_POST['contact1'])); 
     
    $connection = mysql_connect("localhost", "root", "");
    $db = mysql_select_db("bdd", $connection); 
    if (isset($_POST['name1'])) {
    $query = mysql_query("insert into form_element(name, email, contact) values ('$name2', '$email2', '$contact2')");
    echo "insert ok";
    }
    //mysql_close($connection); 
    ?>

  11. #11
    Invité
    Invité(e)
    Par défaut
    @headmax

    Tu mélanges du mysqli_ et du mysql_...

    Ne pas confondre :

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 383
    Points : 10 411
    Points
    10 411
    Par défaut
    @headmax
    Si tu donne l'exemple avec mysql il faut utiliser mysql_real_escape_string et non pas mysqli_real_escape_string.

    C'est mieux (plus universel) d'utiliser urldecode() avec php pour récupérer des variables qui ont été encodées avec encodeURIComponent. Certes l'emploi de encodeURIComponent n'est pas toujours indispensable côté javascript mais pourquoi s'en priver, cela permet d'avoir un code fonctionnel en toutes circonstances sans se poser de question.

    Et effectivement ajax c'est de l'utf8, tu as bien fais de bien le préciser

    EDIT : ah juste grillé d'une minute par jreaux62 concernant ma première remarque

  13. #13
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Oui merci de le relever c'est corrigé, le copier-coller c'est la porte ouverte aux conneries je devient bigleux.

  14. #14
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Dans cet exemple avec mysql_real_escape_string, si je saisis "+" cela enregistre un espace vide dans la table (MyISAM/utf8_general_ci), exemple "aaa+++aaa" s'enregistre "aaa aaa".
    Les caractères "éèçà" deviennent des "éèçÃ", ce qui rend la base de données illisible mais le problème d'apostrophe et caractère "&" sont résolus avec cette méthode, qui n'est pas sans effet...

    Je continue de chercher...


  15. #15
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    @dominos la base de donnée qui contient la table (MyISAM/utf8_general_ci) est-elle aussi sur cette même configuration?
    Il faut que tes serveur soit en uf8 APACHE PHP MYSQL par défaut ou (de devoir toujours le faire après la connexion a ta DB ... Via mysql_set_charset($con,"utf8") ou dans ta requête SET NAMES utf8; voir via la console : mysql --default-character-set=utf8)

    Apaches :
    httpd.conf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    AddDefaultCharset utf-8
    ...

    Mysql :
    my.ini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [client]
    default-character-set=utf8
    ...
    [mysql]
    default-character-set=utf8
    ...
     
    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    ...

    Pour les caractères échappés ("+", ...) ils sont considéré comme "insecure" et sont échappés "escape" donc si tu as besoin que ces caractères soit aussi enregistré, il faudra avant d'enregistrer ou mettre à jours, "INSERT" "UPDATE" les sérialisés avant d'utiliser cette function http://php.net/manual/fr/function.serialize.php et les désérialiser pour obtenir un tableau PHP pour le traitement lors des "SELECT " ... http://php.net/manual/fr/function.unserialize.php.

  16. #16
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 383
    Points : 10 411
    Points
    10 411
    Par défaut
    Oui et souviens-toi que si tu veux pouvoir accepter tout type de chaine avec des caractères spéciaux dans tes variables en transitant par javascript il faut utiliser encodeURIComponent côté js et urldecode côté php.


    Aussi si tu dois indiquer le charset dans le code php il faut utiliser de préférence mysql_set_charset("utf8",$con) plutot que faire une requête avec SET NAMES, c'est indiqué dans une note la doc de mysql_set_charset.

    Faudra aussi faire attention dans ta page de formulaire, si tu as un serveur php < 5 .6 les entêtes php sont en iso et elles vont prendre le pas sur les entête html, faudra dans ce cas envoyer un header en haut de tes page php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-type: text/html; charset=UTF-8');
    .

    Au passage, headmax a fait une erreur d'étourderie en te donnant la syntaxe qui correspond à mysqli_set_charset avec les paramètres inversés. Pour dire que ça fait quand même pas mal de travail de passer ensuite à mysqli. Tu ne devrais plus utiliser mysql, y'a des grandes bannières d'avertissement dans toutes les fonctions mysql et ça fait plus de cinq ans qu'on le dit. Tu vas finir par être bloqué pour les mises à jours serveur et en plus tu produis du code que tu ne pourras pas réutiliser dans d'autres projets. PDO c'est le présent et l'avenir si tu as un peu de temps sinon faudrait te rabattre sur mysqli (qui supporte aussi les requêtes préparées mais qui est beaucoup moins pratique et beaucoup plus laborieux à écrire que pdo).

  17. #17
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Merci encore, avec toutes ces réponses j'ai de quoi faire...

    juste une question pour la route, est-il possible d'attribuer une fonction PHP plutôt qu'un fichier dans l'attribut URL dans la partie Ajax ?

    Remerciement,

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 383
    Points : 10 411
    Points
    10 411
    Par défaut
    Pourquoi faire ?

    Tu peux bien insérer du php dans du javascript (cependant le javascript ne sera plus externalisable) mais dans tous les cas, concernant la valeur du paramètre URL, il faudra que le résultat du traitement php donne le nom du fichier de destination de la requête ajax puisque c'est la valeur attendue.

  19. #19
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    J'imagine que tu souhaiterais utiliser cette chaine de caractère "nom de ta function" pour la transformer en code source avec call_user_func() ou eval en PHP se qui t'expose a de gros risque de sécurité, donc j'éviterais .
    Une personne malveillante pourra appeler toute les functions native à PHP et pourra faire tout ce qui souhaite, sur ton serveur depuis l'exterieur.

  20. #20
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Merci, je n'avais pas vu les choses sous cet angle là, niveau sécurité.
    En fait c'est juste que j'ai une classe commune PHP, et souhaitais appeler directement une méthode plutôt que d'avoir un fichier isolé.

    Sinon, tout le reste fonctionne maintenant, grâce à vos conseils et utf8..., mais quand je fais une boucle pour afficher le résultat, si la chaine contient du html ou du javascript,
    cela est afficher aussi,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	$query = mysql_query("SELECT * FROM test ORDER BY id ASC");
    	while ($row = mysql_fetch_array($query))
    	{
    		$id = $row["id"];
    		$name = $row["name"];
    		$email = $row["email"];
    		$contact = $row["contact"];
     
    		echo "<br>".$name;
    		echo "<br>".$email;
    		echo "<br>".$contact;
     
    	}

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Php Formulaire ajax et caractère spéciaux
    Par leFred dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2010, 17h15
  2. [AJAX] Ajax + formulaires + caractères spéciaux
    Par Gabzor dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 23/05/2008, 11h29
  3. Perte des accents et autres caractères spéciaux.
    Par pacific dans le forum Coldfusion
    Réponses: 1
    Dernier message: 19/07/2007, 01h17
  4. [AJAX] Ajax et les caractères spéciaux
    Par Moloc'h dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/01/2006, 14h02
  5. Réponses: 3
    Dernier message: 27/11/2004, 16h23

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