Vérification de doublons

Résolu
eddie5150 Messages postés 34 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 20 octobre 2008 - 21 oct. 2007 à 22:56
eddie5150 Messages postés 34 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 20 octobre 2008 - 22 oct. 2007 à 17:37
Bonjour à tous,

je viens de me lancer dans AJAX, mais je ne comprends pas encore tout très bien,
aussi j'ai essayé d'effectuer une vérification automatique de mail dans un formulaire, jusque là, c'est du Javascript, tout va bien, cependant, il me faudrait également vérifier si ce mail n'est pas déjà présent dans ma BDD.

Voila comment je procede :

function verif_mail()
{
    //Différentes vérifications ....
   
    if(!verifDoublon(mail))
       alert("Doublon");
}

function verifDoublon(mail)
{
    var xhr_object = null;  
       
    if(window.XMLHttpRequest) // Firefox  
       xhr_object = new XMLHttpRequest();  
    else if(window.ActiveXObject) // Internet Explorer  
       xhr_object = new ActiveXObject("Microsoft.XMLHTTP");  
    else
    { // XMLHttpRequest non supporté par le navigateur  
       alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");  
    }   
       
    xhr_object.onreadystatechange = function()
    {  
       if(xhr_object.readyState == 4) 
       {
           if(xhr_object.status  == 200)
              if(xhr_object.responseText == '0')
                  return true;
              else
                  return false;
           else
                alert("Erreur: "+xhr_object.status);
        }
    }  
      
    xhr_object.open("POST", "requete.php", false);
    xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");     xhr_object.send("mail="+mail);
}

requete.php
if(isset($_POST["mail"]))
{
    $mysql_db = @mysql_connect("localhost", "root", "");  
    @mysql_select_db("pronosite_01");  
   
    $query  = "SELECT `email_util` FROM `utilisateur` WHERE `email_util` LIKE '".$_POST["mail"]."'";
    $result = @mysql_query($query);  
   
    echo mysql_num_rows($result);
   
    @mysql_close($mysql_db);  
}

Voila, ca ne marche pas, j'ai comme l'impression que mes return true ou false ne sont jamais appelés... Quelqu'un pourrait-il m'éclairer ?

Merci d'avance

4 réponses

cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
22 oct. 2007 à 15:50
En mode asynchrone, l'execution du code de gestion du retour est différée.

Tu ne peux pas faire :

    if(!verifDoublon(mail))
       alert("Doublon");

Parce que l'execution retourne immédiatement après le send(). et dans ton cas la fonction ne retourne rien.
Deux solutions :
- lancer le verifDoublon et gérer la reponse dans le callback
- mettre en place un mécanisme de timeout sur la requete (une sorte de sleep) avant de decider de traiter la réponse.

Pour faire simple, si tu n'a pas besoin de mécanisme asynchrone, ne les utilises pas.
3
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
22 oct. 2007 à 13:20
Tu utilises l'objet xmlhttprequest en mode synchrone :
xhr_object.open("POST", "requete.php", false);
La fonction de callback (onreadystatechange ) n'a pas d'utilité dans ce cas.
Il suffit de mettre le code de traitement de la réponse juste après le send()

xhr_object.send("mail="+mail); // L'éxécution du code est bloquée jusqu'au retour de la réponse (mode synchrone)
       if(xhr_object.readyState == 4) 
       {
           if(xhr_object.status  == 200)
              if(xhr_object.responseText == '0')
                  return true;
              else
                  return false;
           else
                alert("Erreur: "+xhr_object.status);
        }
return false;
0
eddie5150 Messages postés 34 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 20 octobre 2008 1
22 oct. 2007 à 13:38
Merci pour la réponse !

Désolé mais j'ai fait une erreur en coiant mon code !! Je voulais plutot le faire en mode asynchrone : xhr_object.open("POST", "requete.php", true);

En tout cas ta propostition marche tres bien, cependant, pour exécuter en mode asynchrone, quelle serait la technique ?
0
eddie5150 Messages postés 34 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 20 octobre 2008 1
22 oct. 2007 à 17:37
Ok,

merci pour ces précisions, je vais le faire en mode synchrone alors !
0
Rejoignez-nous