2012-07-06 44 views
4

我只是遷移我對PDO風格代碼的mysql_query風格命令和我遇到了一個問題。舊代碼是這樣的:PDO - 傳遞字段名作爲變量

$query_list_menu = "SELECT ".$_GET['section_name']." from myl_menu_hide_show WHERE id='".$_GET['id']."'"; 

和更新的代碼看起來像下面。顯然它不工作。我在$_GET['section_name']中存儲了一個表示數據庫字段名的字符串。但是我認爲當我把它作爲一個變量傳遞時存在一個問題。下面的代碼是否有效?謝謝。

$query_list_menu = "SELECT :section_name from myl_menu_hide_show WHERE id=:id"; 
$result_list_menu = $db->prepare($query_list_menu); 
$result_list_menu->bindValue(':section_name', $_GET['section_name'] , PDO::PARAM_STR); 
$result_list_menu->bindValue(':id', $_GET['id'] , PDO::PARAM_INT); 
$result_list_menu->execute(); 

回答

11

如果$_GET['section_name']包含列名,您的查詢應該是:

$query_list_menu = "SELECT " . $_GET['section_name'] . " from myl_menu_hide_show WHERE id=:id"; 

,並提供:

$query_list_menu = "SELECT :section_name from myl_menu_hide_show WHERE id=:id"; 
$result_list_menu = $db->prepare($query_list_menu); 
$result_list_menu->bindValue(':id', $_GET['id'] , PDO::PARAM_INT); 
$result_list_menu->execute(); 

的原因是你想要的列在實際的名稱查詢 - 你已經把它改成了一個參數,這並沒有多大意義。

我還要補充一點,使用$_GET['section_name']直接像這樣的是一個巨大的安全風險,因爲它允許SQL注入。我建議你通過建立和執行查詢之前檢查它針對的列清單驗證的$_GET['section_name']值。

+2

一個附加的1用於建議檢查。 – dezso 2012-07-06 09:11:03

+0

非常感謝菲爾.....我你是怎麼指出並也執行DB更新和基本SELECT *碼* ONLY如果$ _GET [「SECTION_NAME」]變量將檢查對12個名我用了這張表....確保沒有發生SQL注入:)再次感謝指出我的錯誤。祝你有美好的一天 – 2012-07-06 09:20:21