2013-10-30 125 views
-1

我在網上找到了這段代碼,我想了解它。我已閱讀PHP文檔,但我發現,該堆棧溢出社區提供更好的解釋:我需要了解此代碼

function mysql_safe_query($query) { 
    $args = array_slice(func_get_args(),1); 
    $args = array_map('mysql_safe_string',$args); 
    return mysql_query(vsprintf($query,$args)); 
} 

我的數字函數不是內建PHP函數。 array_slice從數組func_get_args返回一個偏移量爲1的元素序列。

我擡頭看了func_get_args,它應該返回給定元素(數組?對象)的副本?我想vsprintf返回一個格式化的字符串,刪除字符串引號「'?

+2

有關內部PHP函數將執行的所有問題將在http://php.net上得到解答 - 請在閱讀手冊後回來,並留下任何問題。 – Sven

+2

調用類似於'mysql_safe_query(「SELECT name,age FROM tbl WHERE name ='%s'」,$ input_name)''的函數,並且得到'vsprintf(「SELECT name,age FROM tbl WHERE name ='%s' mysql_safe_string($ input_name))'。該函數用於避免SQL注入,而不必重複鍵入'mysql_safe_string'。 –

+0

閱讀手冊,使用測試腳本中的函數進行操作,並逐行處理。如果有人向你解釋,你會說「好極了」,然後必須繼續努力。要點是,你必須投入運動,人們只能解釋這麼多。 – Ben

回答

1

正如函數名稱所示,它應該可以幫助您執行更安全的MySQL查詢。但是,它基於已棄用的mysql_query。相反,你應該看看PDO或至少MySQLi

儘管方法簽名表明該方法只需要一個參數,但實際上可以爲其傳遞任意數量的參數,例如,

mysql_safe_query("SELECT * FROM users WHERE gender = '%s' AND city = '%s'", 
    "Female", "Denver"); 

第一部分查詢將在$query中。所有參數將使用func_get_args()訪問。我們將數組切片以忽略查詢部分,因此我們將留下包含「女性」和「丹佛」的數組$args。之後,通過mysql_safe_string過濾所有參數,即在「女性」和「丹佛」上執行mysql_safe_string。最後,將「女性」和「丹佛」插入到查詢中並執行查詢。