2011-11-03 116 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?

了解更多详情。