Ajax Xhr.responseText undefined

Bonjour,

j'ai un probelemme au niveau de Xhr.responseText, je m'explique.

J'ai un formulaire d'inscription ou je dois verifier si un email existe ou pas dans ma base de données , j'envoie alors une requete a une page check-email.php, qui echo"no" si lemail existe et echo "yes" sinon, dans la page du formulaire je fais une alert pour voir la valeur du xhr.responseText mais l'alerte affiche undefined, je ne sais plus comment faire, j'ai recherché sur le web mais ca ne marche pas, je vous laisse alors mon code et attend votre aide, et merci .
------------------------------------------formulairenewsletter.php--------------------------------------------------
<script type='text/javascript'>
function getXhr() {
var xhr = null;
if(window.XMLHttpRequest)
xhr = new XMLHttpRequest();
else if(window.ActiveXObject){
try
{
xhr = new ActiveXObject("Msxml2.XMLHTTP");}
catch (e)
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else
{
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xhr = false;
}
return xhr;
}
function req_email(){
var Xhr = getXhr();
var email = document.formulaire.email.value;
Xhr.open("POST", "check_email.php",true);
Xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
Xhr.send("email="+email);
Xhr.onreadystatechange = function()
{
if(Xhr.readyState == 4 && Xhr.status == 200){
var reponse = Xhr.responseText;}
return reponse;
}
}

function validation(){
var reponse = req_email();
var verif = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,6}$/
var flag = true;
if((document.formulaire.email.value=="")||(verif.exec(document.formulaire.email.value) == null))
{
flag = false;
}
else if (reponse == "0")
{
flag = false;
}
else
{
document.formulaire.email.style.visibility= "hidden";
}
return flag;
}
</script>
<div class="newsletter">
<form method="post" action="" name="formulairenewsletter" onsubmit= "return validation();">
Newsletter:<input type="text" name="email" id="email"/><input type="submit" value="Ok"/</form></div>
------------------------------------------check-email.php--------------------------------------------------

<?php
$email = $_POST['email'];
$link = mysql_connect("localhost","root","");
mysql_select_db("mybd");
$req = "select * from newsletter where email='$email'";
$result = mysql_db_query("mybd",$req,$link) or die(mysql_error());
$resultat = mysql_fetch_array($result);
if($resultat){
echo "0";
$requete = "INSERT INTO newsletter (email) VALUES ('$email')";
$result = mysql_query($requete,$link) or die($requete ."----". mysql_error());}
else
echo "1";
mysql_close();
?>
Configuration: Windows XP
Internet Explorer 7.0

17 réponses

  1. Moi je n'ai jamais eu de soucis avec POST en Ajax
    1
    1. Ba t'as bien de la chance :D, mais il me semble aussi que tu as plus de métier que moi^^, donc ça m'étonne pas franchement^^
      0
  2. Bonsoir,

    J'avais commencé à ta répondre mais j'ai du m'absenter alors voici mes conclusions:

    tu n'as pas mis de div pour recevoir l'innerHtml

    et surtout tu n'as pas mis ton Xhr.onreadystatechange =..... au bon endroit, il le faut avant l'envoi !! he oui ça surprend mais c'est ainsi, il faut dire que faire de la réponse avant d'envoyer la question

    essayes comme ça: (chez moi ça marche)

    <html>
    <head>
    <script type='text/javascript'>
    function validation(){
    	var reponse = req_email();
    	//alert(reponse);//ceci affiche undefined//
    	var verif = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,6}$/
    	var flag = true;
    	if((document.getElementById("email").value=='Votre adresse email ici..')
    	||(document.getElementById("email").value=="")
    	||(verif.exec(document.getElementById("email").value) == null))
    	{
    	document.getElementById("email").style.border = 'red 1px solid';
    	document.getElementById("spanemail").innerHTML='Email invalide..';
    	flag = false;
    	}
    	else if (reponse == 0)
    	{
    	document.getElementById("email").style.border = 'red 1px solid';
    	document.getElementById("spanemail").innerHTML="email deja existant";
    	flag = false;
    	}
    	else
    	{
    	document.getElementById("email").style.visibility= "hidden";
    	document.getElementById("spanemail").innerHTML="";
    	}
    	return flag;
    }
    
    function req_email(){
    	var rep;
    	var Xhr = getXhr();
    	var email = document.getElementById("email").value;
    	Xhr.onreadystatechange = function()
    	{
    	if(Xhr.readyState == 4 && Xhr.status == 200){
    	rep=Xhr.responseText;
    	alert(Xhr.responseText); 
    	}
    	return rep;
    	}
    	Xhr.open("POST","check_email.php",true);
    	Xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	var data="email="+email;
    	//alert("Val envoyée: "+data);
    	Xhr.send(data);
    	
    	
    	
    }
    
    function getXhr() {
    	var xhr = null;
    	if(window.XMLHttpRequest)
    	xhr = new XMLHttpRequest();
    	else if(window.ActiveXObject){
    	try
    	{
    	xhr = new ActiveXObject("Msxml2.XMLHTTP");}
    	catch (e)
    	{
    	xhr = new ActiveXObject("Microsoft.XMLHTTP");
    	}
    	}
    	else
    	{
    	alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    	xhr = false;
    	}
    	return xhr;
    }
    </script>
    </head>
    <body>
    <div class="newsletter">Newsletter: <input type="text" id="email" >
    
    <input type="button" value="ok" onclick= "return validation();"/></div>
    <div id="spanemail"></div>
    </body>
    </html>
    1
    1. pour ton script chek-email.php

      essayes comme ça:

      ------------------------------------------check-email.php--------------------------------------------------
      
      <?php
      $email = $_POST['email'];
      $link = mysql_connect("localhost","root","");
      mysql_select_db("mybd"); //es tu sur de ce nom de base ?
      $req = "SELECT * FROM newsletter WHERE email='$email'";
      $result = mysql_db_query("mybd",$req,$link) or die(mysql_error());
      $nb_enr = mysql_num_rows($result);
      if($nb_enr == 0){
      	echo "0";
      	$requete = "INSERT INTO newsletter (email) VALUES ('$email')";
      	$result = mysql_query($requete,$link) or die($requete ."----". mysql_error());
      }else{
      	echo "1";
      }
      mysql_close();
      ?>
      0
      1. t'as contrôlé ta var mail? T'as essayé en passant ton ajax en GET et non en POST? (j'ai toujours eu des soucis avec post en ajax...)
        0
        1. une anomalie:

          dans ton JS tu mets: document.formulaire.email.value

          hors ton formulaire se nomme: formulairenewesletter
          0
          1. c'est de ça dont je parlais à propos de la var mail^^ à mon avis ça vient de là^^
            0
        2. Merci pour vos reponses, mais je n'arrive pas encore a trouver la solution,
          au fait j'ai changé ce matin, je ne travaille plus avec formulaire, voila la nouvelle version de mon code:
          -----------------------------------------------ma page.php--------------------------
          <html>
          <head>
          <script type='text/javascript'>
          function validation(){
          var reponse = req_email();
          alert(reponse);//ceci affiche undefined//
          var verif = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,6}$/
          var flag = true;
          if((document.getElementById("email").value=='Votre adresse email ici..')
          ||(document.getElementById("email").value=="")
          ||(verif.exec(document.getElementById("email").value) == null))
          {
          document.getElementById("email").style.border = 'red 1px solid';
          document.getElementById("spanemail").innerHTML='Email invalide..';
          flag = false;
          }
          else if (reponse == 0)
          {
          document.getElementById("email").style.border = 'red 1px solid';
          document.getElementById("spanemail").innerHTML="email deja existant";
          flag = false;
          }
          else
          {
          document.getElementById("email").style.visibility= "hidden";
          document.getElementById("spanemail").innerHTML="";
          }
          return flag;
          }
          function req_email(){
          var rep;
          var Xhr = getXhr();
          var email = document.getElementById("email").value;
          Xhr.open("POST","check_email.php",true);
          Xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
          Xhr.send("email="+email);
          alert(Xhr.responseText);
          Xhr.onreadystatechange = function()
          {
          if(Xhr.readyState == 4 && Xhr.status == 200){
          rep=Xhr.responseText;
          }
          }
          return rep;
          }
          function getXhr() {
          var xhr = null;
          if(window.XMLHttpRequest)
          xhr = new XMLHttpRequest();
          else if(window.ActiveXObject){
          try
          {
          xhr = new ActiveXObject("Msxml2.XMLHTTP");}
          catch (e)
          {
          xhr = new ActiveXObject("Microsoft.XMLHTTP");
          }
          }
          else
          {
          alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
          xhr = false;
          }
          return xhr;
          }
          </script>
          </head>
          <body>
          <div class="newsletter">Newsletter: <input type="text" id="email" >
          <input type="button" value="ok" onclick= "return validation();"/></div>
          </body>
          -----------------------------------------------check_email.php--------------------------
          <?php
          $email = $_POST['email'];
          $link = mysql_connect("localhost","root","");
          mysql_select_db("mybd");
          $req = "select * from newsletter where email='$email'";
          $result = mysql_db_query("mybd",$req,$link) or die(mysql_error());
          $resultat = mysql_fetch_array($result);
          if($resultat){
          $requete = "INSERT INTO newsletter (email) VALUES ('$email')";
          $resultaa = mysql_query("mybd",$requete,$link) or die(mysql_error());
          mysql_close();
          echo 0;
          }
          else
          echo 1;
          ?>
          0
          1. fais des alert sur toutes les var précédant ton problème^^ histoire de définir celle qui coince
            0
            1. je mets une alerte dans la fonction req_email alert(email)
              ceci m'affiche l'email, xhr.send envoie cet email a la page check-email, celle ci doit retourner sur xhr.response text 1 ou 0, malheureusement ceci ne marche pas,
              0
              1. ya t'il quelqu'un qui pourra m'expliquer pourquoi est ce que je ne recupere pas les valeur 0 et 1 qui sont dans les echo de la page check-email.php, dans Xhr.responseText ?? et que au lieu ca donne undefined ??
                0
                1. fais echo $_POST['email']; dans ton check_email.php, pour vérifier la réception
                  0
                  1. (ah et n'oublis pas de supprimer les espaces avant <?php et après ?>, c'est la cause de pas mal d'erreurs)
                    0
                    1. j'ai meme tout enlever de la page check-email.php

                      j'ai mis

                      <?php
                      echo $_POST['email];
                      ?>
                      et impossible de le recuperer dans xhr.responseText, ca donne undefined :s
                      0
                      1. ton objet Xhr n'a alors peut être pas été récupéré dans ta fonction reqmail()

                        d'habitude je fais la création du xhr dans la fonction concernée, comme ça j'suis sûr qu'il n'y aura aucun problème

                        function getIn(){
                        var mdpToChk=document.getElementById('pass').value;
                        var button=document.getElementById('hand');
                        if(window.XMLHttpRequest)
                        {
                        var htr=new XMLHttpRequest();
                        }

                        if(window.ActiveXObject)
                        {
                        var htr=new ActiveXObject('Microsoft.XMLHTTP');
                        }
                        var url="connecter.php?pass="+mdpToChk;
                        htr.open("GET",url,false);
                        htr.send("null");
                        button.innerHTML=htr.responseText;
                        }
                        0
                        1. non plus, ca ne marche pas, je ne crois pas que c'est a cause de ca, une question, est ce que la valeur de xhr.responsetext viens de echo qu'on mets dans check-email.php ?
                          0
                          1. oui^^, en y regardant de plus près il est bizarre d'ailleurs ton fichier^^ test le sans ajax, si ça fonctionne, le problème vient pas de lui, sinon, ça vient de lui^^
                            0
                            1. si t'as vraiment mis ça:
                              if($resultat){
                              $requete = "INSERT INTO newsletter (email) VALUES ('$email')";
                              $resultaa = mysql_query("mybd",$requete,$link) or die(mysql_error());
                              mysql_close();
                              echo 0;
                              }
                              else
                              echo 1;

                              c'est pas très bon^^

                              t'as pas terminé tes accolades, et je doute que ça fonctionne sans while pour balayer le retour de ta requête :s
                              0
                              1. tu as inversé les deux fonctions req_email et validation
                                validation est appelé à la saisie et veut afficher la reponse
                                l affichage doit se faire au retour
                                je ne suis pas sur que ta fonction req_email retourne reponse
                                le fonction "nichée" seule retourne reponse

                                0