2011-07-28 234 views
2

我希望得到解決的任何建議。在Javascript中按順序執行命令

我正在使用JS函數checkAvailability()來確認一個組是否可用於添加到數據庫。 (由於某些原因,數據庫密鑰約束不適用) 執行此操作時,有時我的函數甚至會在從PHP文件接收輸出之前返回。

所以我得到了一個混合的結果。當收到來自PHP文件的輸出時,它顯示正確的結果。但其餘時間它只是返回假。

任何關於如何解決這個問題的指針? 代碼如下:

謝謝, Vish

//函數來檢查組名可用性

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

爲什麼你不想比較結果作爲字符串?如果(結果=='0'){... – heximal

+0

用戶:Re @ Delan的評論,這是一個真正的問題,你會想要在你的代碼中處理。更多:http://en.wikipedia.org/wiki/Sql_injection –

回答

0

問題是$.post發送異步請求和其他鱈魚的請求e在從服務器到達響應之前執行。

解決方法是使用$.ajax()並將async選項設置爲false,以使該呼叫同步。是這樣的:

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

你的函數應該總是您的Ajax請求PHP頁面完成前返回,因爲Ajax請求是異步。您開始它在您的功能,但它完成後,網絡操作完成。 .post不會阻止等待結果。

您可以通過使用.ajax而不是.postasync: false選項來阻止,但在許多瀏覽器上,在網絡請求期間以不愉快的方式鎖定用戶界面。

相反,有你的函數接受一個回調,它將與操作的結果稱:

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(); 
if (checkAvailability()) { 
    itsAvailableLetsDoSomething(); 
    moreAvailableStuff(); 
} 
else { 
    itsNotAvailableDoSomethingElse(); 
    otherStuff(); 
} 

...反而會看像這樣:

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'); 

      }} 
    }); 

}