2010-01-09 61 views
0

我創建了一個小php腳本,根據給定的post/get參數返回一個mysql結果。有了這個文件,我現在可以使用jquery.post或.get命令從我的數據庫中取回某些東西。jQuery ajax輸出作爲函數的返回

該腳本始終返回1值。所以我試圖做一個JavaScript函數,它返回從數據庫中檢索到的值。

這就是我想要它做的,但我並不像它應該工作:

function mysql(args) { 
    $.post("scripts/ajax_mysql.php",args,function(data) { 
     return data; 
    }); 
} 

var value=mysql({ table:"user", where:"nickname='test'", get:"email" }); 

看來當函數已經通過檢索數據。有沒有解決方法?

+3

這看起來像一個可怕的安全漏洞,你有效地讓任何訪問者訪問你的整個數據庫。另外看看:http://en.wikipedia.org/wiki/SQL_injection – 2010-01-09 13:58:44

+0

沒錯,沒有想到這一點。 – Jens 2010-01-09 14:01:35

+0

有沒有一種安全的方法來實現這一點? – Jens 2010-01-09 14:09:59

回答

0

問題是return data語句不會導致mysql函數中的「返回」。

我會做的是從mysql函數返回XMLHTTPRequest對象$.post調用返回,然後添加一個成功的Ajax調用的偵聽器。

1

Ajax是異步的。調用函數會觸發請求,然後程序繼續。

當請求返回時,事件觸發以及附加的事件處理程序處理數據。

您可以使用XHR進行同步,但不推薦。

設計你的程序來處理回調中檢索到的數據,而不是返回的變量。

2

拋開讓用戶基本上創建任何類型的SQL命令並將其發送到服務器的問題 - 一個帶有可怕安全隱患的可怕想法,腳本的問題是無法理解AJAX的本質。

AJAX調用是異步的,所以您的方法在AJAX調用完成之前返回。你有兩種方法來解決這個問題。將回調傳遞給您的函數,並在AJAX帖子完成時執行回調。這保持了請求的異步性質。或者,您可以使用完整的$ .ajax()語法來完成該帖子並將async參數設置爲true。然後,您可以將AJAX請求的結果存儲到函數的外部塊的變量中,並在函數結束時將其返回。將async設置爲true基本上是使用回調函數做的,除了jQuery在底層處理它。

function mysql(data, callback) { 
    $.post("scripts/ajax_mysql.php",args,function(data) { 
     if (callback) { 
      callback(data); 
     } 
    }); 
} 

mysql({ table:"user", where:"nickname='test'", get:"email" }, function(user) { 
    $('#email').val(user.email); 
    ... 
}); 

function mysql(data, callback) { 
    var value; 
    $.ajax({ 
     url: "scripts/ajax_mysql.php", 
     type: 'post', 
     async: false, 
     data: args, 
     success: function(data) { 
        value = data; 
       } 
    }); 
    return value; 
} 

與您現有的調用語義。

+0

這種方式我應該刪除整個mysql函數並使用$ .post回調函數。 – Jens 2010-01-09 14:07:14

+0

不一定。將代碼集打包以減少重複設置可能很方便。你想保持你的JavaScript乾燥。 – tvanfosson 2010-01-09 14:10:39