2011-07-28 10 views
2

これを解決するための提案をいただき、ありがとうございます。Javascriptでコマンドを連続して実行する

私はグループにデータベースに追加できるかどうかを確認するためにJS関数checkAvailability()を使用しています。 (何らかの理由で、データベースのキー制約が適用されませんでした) これを実行している間に、PHP関数の出力を受け取る前でも関数が返ることがあります。

私は混乱した結果を得ます。 PHPファイルからの出力を受け取ると、正しい結果が表示されます。しかし、それはちょうど偽を返す時代の残りの部分。

どのようにこの問題を解決するための指針ですか? コードは次のとおりです。問題は$.postが送信するということです

function checkAvailability(){ 
     var grpname = $('#groupname').val(); 
     var isAvailable = false 

     //use ajax to run the check 
     $.post("checkGroupName.php", { gname: grpname }, 
      function(result){ 
       if(Number(result) == 0){ 
        //show that the groupname is available 
        isAvailable = true ; 
        $('#username_availability_result').html(grpname + ' is Available'); 
       } 
       else{ 
        //show that the groupname is NOT available 
        isAvailable = false ; 
        $('#username_availability_result').html(grpname + ' is already taken'); 

       } 
     }); 

    alert("isAvailable : "+isAvailable); 
    return isAvailable ; 
} 

checkGroupName.phpが

$gname = $_POST['gname']; 
$query = "SELECT * FROM groups WHERE group_name='$gname'"; 
$result = mysql_query($query); 
if(mysql_num_rows($result)){   
    echo 1; 
else 
    echo 0; 
+5

を試すことができます私は確かにあなたのアプリケーションにSQLインジェクション攻撃を実行することができることが大好き! –

+0

結果を文字列として比較したいのですが? if(result == '0'){... – heximal

+0

user:Re @ Delanさんのコメントは、あなたのコードで対処したいと思う本当の問題です。その他:http://en.wikipedia.org/wiki/Sql_injection –

答えて

0

ファイル

おかげで、 Vish

//関数はグループ名の可用性をチェックしますリクエストは非同期的に、残りのタラeは、応答がサーバーから到着する前に実行されます。

解決策は、$.ajax()を使用し、非同期オプションをfalseに設定してコールが同期するようにすることです。以下のようなもの:AJAXリクエストが非同期あるので

function checkAvailability(){ 
     var grpname = $('#groupname').val(); 
     var isAvailable = false 

     //use ajax to run the check 
     $.ajax({ 
       type: 'post', 
       url: 'checkGroupName.php', 
       dataType: 'json', 
       data: { gname: grpname }, 
       async: false, 
       success: function(result){ 
        if(Number(result) == 0){ 
        //show that the groupname is available 
        isAvailable = true ; 
        $('#username_availability_result').html(grpname + ' is Available'); 
       } 
       else{ 
        //show that the groupname is NOT available 
        isAvailable = false ; 
        $('#username_availability_result').html(grpname + ' is already taken'); 

       } 
     }); 

    alert("isAvailable : "+isAvailable); 
    return isAvailable ; 
} 
+0

他のオプションがない場合、同期ajax呼び出しが最後の手段になるはずです。ほぼいつもあります。 – JJJ

+0

すべてのオプションを提示するのが正しいと思います。それはすべてのOPのニーズに依存して、私は私の答えが間違っているとは思わない、私は他のオプションがあると思います(もちろん、より良いですが、コードのより多くのリファクタリングが必要です)。 –

4

あなたの関数は常には、PHPのページにあなたのAJAX要求の前に戻ってする必要がありますが、完了します。あなたはに起動しますが、ネットワーク操作が完了すると完了します。 .postは、結果の待機をブロックしません。

あなたはそれがasync: falseオプションではなく、ネットワーク要求の際に不快な方法でUIをロックアップする多くのブラウザに.ajaxではなく.postを使用してブロックすることができます。

doSomething(); 
if (checkAvailability()) { 
    itsAvailableLetsDoSomething(); 
    moreAvailableStuff(); 
} 
else { 
    itsNotAvailableDoSomethingElse(); 
    otherStuff(); 
} 

...代わりになります。

function checkAvailability(callback) { 
    var grpname = $('#groupname').val(); 

    //use ajax to run the check 
    $.post("checkGroupName.php", { gname: grpname }, 
     function(result){ 
      if(Number(result) == 0){ 
       //show that the groupname is available 
       $('#username_availability_result').html(grpname + ' is Available'); 
       callback(true); 
      } 
      else{ 
       //show that the groupname is NOT available 
       $('#username_availability_result').html(grpname + ' is already taken'); 
       callback(false); 
      } 
    }); 
} 

コードこれを行うために使用される。その代わり

、あなたの関数は、それが操作の結果を呼び出すコールバックを受け入れてい

doSomething(); 
checkAvailability(function(available) { 
    if (available) { 
     itsAvailableLetsDoSomething(); 
     moreAvailableStuff(); 
    } 
    else { 
     itsNotAvailableDoSomethingElse(); 
     otherStuff(); 
    } 
}); 

ご覧のとおり、影響は最小限ですが、これを行うことで非同期通信の利点は、UIの応答性を維持することです。

0

あなたはこのコード

関数checkAvailability(){

var grpname = $('#groupname').val(); 
    var isAvailable = false 
    $.ajax({ 
     type: "POST", 
     url: "checkGroupName.php", 
     data: {grpname : grpname }, 
     success: function (result) { 
     if(Number(result) == 0){ 
       //show that the groupname is available 
       isAvailable = true ; 
       $('#username_availability_result').html(grpname + ' is Available'); 
      } 
      else{ 
       //show that the groupname is NOT available 
       isAvailable = false ; 
       $('#username_availability_result').html(grpname + ' is already taken'); 

      }} 
    }); 

}

関連する問題