2012-03-25 7 views
0

Ich habe ein Anmeldeformular. Wenn ich auf die Submit-Schaltfläche klicke, sollte überprüft werden, ob der Benutzername nicht vergeben ist und die Passwörter übereinstimmen. Also habe ich ein paar Funktionen geschrieben: eine, die die Passwörter überprüft, eine, die prüft, ob der Benutzername verfügbar ist und die Hauptfunktion, die die 2 Prüffunktionen erfordert. Die Passwort-Check-Funktion funktioniert gut, aber mein Problem ist mit der User-Checking-Funktion. Dies ist die Funktion:Verwendung von synchronen JAX in Registrierungsformular zur Überprüfung der Verfügbarkeit von Benutzernamen

function checkIsUsernameExist(){ 
    if($("#txtNewUsername").val() == "") { 
     $("#divIsUsernameExist").html(""); 
     return false; 
    } else { 
    $.getJSON("inc/API.php", 
     { 
      command : 'isUsernameExist', 
      username : $("#txtNewUsername").val(), 
     }, 
     function(result) 
     { 
      if (result != true){ 
       $("#divIsUsernameExist").html("This username is available!"); 
       return true; 
      } else { 
       $("#divIsUsernameExist").html("This username is not available!"); 
       return false; 
      } 
     }); 
    } 
} 

Wenn der Benutzername leer ist, gibt es False zurück. Wenn jedoch ein Wert eingegeben wird, wird Undefined zurückgegeben. Jemand sagte, ich soll Synchrone JAX verwenden (aber mir nicht sagen, wie), so habe ich versucht, diesen Code zu schreiben:

function checkIsUsernameExistAsync(){ 
    if($("#txtNewUsername").val() == "") { 
     $("#divIsUsernameExist").html(""); 
     return false; 
    } else { 
     $.ajax({ 
      type: 'POST', 
      url: 'inc/API.php', 
      data: ({ 
      command : 'isUsernameExist', 
      username : $("#txtNewUsername").val(), 
      cache: false, 
      async: false 
      }), 
    success: function(result){ 
     if (result != true){ 
       $("#divIsUsernameExist").html("This username is available!"); 
       return true; 
      } else { 
       $("#divIsUsernameExist").html("This username is not available!"); 
       return false; 
      } 
     } 
    }); 
    } 
} 

Aber ich bekomme das gleiche Ergebnis - Falsch, wenn es leer ist, nicht definiert, wenn irgendein Wert ist trat ein. Ich habe versucht, $.ajax zu $.getJSON in der zweiten Funktion zu ändern, aber hatte immer noch das gleiche Ergebnis.

Dies ist der Code von api.php:

case "isUsernameExist": 
     echo (isUsernameExist($_REQUEST["username"])); 
     break; 

es für eine Funktion in eingeschlossener Seite BusinessLogic.php nennt, hier ist diese Funktion:

function isUsernameExist($username) 
{ 
    $arr = select("select * from users where username='$username'"); 
    if(count($arr) == 1) 
    return json_encode(true); 
    else 
    return json_encode(false); 
} 

Wie kann ich es funktioniert? ?

Vielen Dank!

+1

SQL-Injection * hust * .. –

+0

@ Rob Huh? Was hat SQL Injection mit dem zu tun, was ich gefragt habe? – Igal

+0

@lgal Es ist nicht die Ursache des Problems, aber Ihre Anwendung ist verwundbar, weil Sie die Variable '$ username' nicht verlassen. Wie für die Frage selbst und die "Lösung": Sie haben "Async" und "Cache" an der falschen Stelle platziert (derzeit sind sie ein Teil von "Daten"). Außerdem geben die return-Anweisungen im 'success'-Handler keinen Rückgabewert an Ihre Funktion zurück. Sie müssen AJAX-Synchronisierung vermeiden und eine Rückrufmethode ordnungsgemäß implementieren. –

Antwort

1

Kommentar Kette Fassen wir zusammen:

  • Synchron AJAX Anfragen vermeiden: Entfernen async: false
  • hinzufügen `datatype: 'json',
  • return in einem success Handler von jQuery.ajax setzt nicht den Rückgabewert der äußeren Funktion. Um die Ergebnisse korrekt zu übergeben, definieren Sie einen Callback-Handler. Ersetzen:

  • Bevor: http://jsfiddle.net/wGfzc/
  • Nach: http://jsfiddle.net/wGfzc/2/
Verwandte Themen