2011-11-03 31 views
3

我作出了這樣的查詢:如何使用變量列名進行SQL查詢?

$b1 = $_REQUEST['code'].'A'; //letter 'A' is concatenated to $_REQUEST['code'] 
$a = $_REQUEST['num']; 
echo $b1.$a; 
$sql = "SELECT '".$b1."' FROM student_record1 WHERE id=".$a; 
$result = mysql_query($sql); 
if(!$result) 
{ 
    echo '<p id="signup">Something went wrong.</p>'; 
} 
else 
{ 
    $str = $row[0] 
    echo $str; 
} 

這裏$b1$a從另一個頁面獲取值。第三行的'回聲'給出了正確的結果。我在SQL中沒有收到任何錯誤。相反,我沒有從SQL查詢中得到任何結果。我的意思是迴應最後一行。

+0

您是否嘗試過輸出'$ sql'包含的內容?另外,請參閱上文。 – sberry

回答

3

不要這樣做,它會破壞您的關係模型並且不安全。

代替具有與columnEIDcolumnAcolumnBcolumnCcolumnD,一個表和具有該用戶選擇A/B/C/D/E然後挑選的列的,具有三列IDTYPEcolumn和具有TYPEA/B/C/D/E一個表。這也使得事後添加F/G/H/I更容易,而無需修改表格。其次,使用額外的列方法,您不必從輸入值中構建SQL。您可以使用預準備語句,並且可以從SQL注入安全。從未過濾的字符串構建SQL是錯誤的,而且非常危險。它讓你的網站被黑客入侵。

+0

本網站罕見的客人 - 一個明智的答案。 –

+0

更強大的解決方案。 +1給你先生或太太 – Phil

+0

okk ...謝謝你...其實我並不清楚這個sql注入...你可以建議我一些很好的來源來穩定它們... –

1

如果您必須使用動態表/列/數據庫名稱,則必須通過白名單運行它們。

下面的代碼就可以了:

$allowed_column = array('col1', 'col2'); 
$col = $_POST['col']; 
if (in_array($col, $allowed_column)) { 
    $query = "SELECT `$col` FROM table1 "; 
} 

參見:How to prevent SQL injection with dynamic tablenames?

瞭解更多詳情。

相關問題