如何使用变量列名进行SQL查询?

时间:2011-11-03 05:31:49

标签: php mysql 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正在从其他网页获取值。第三行中的'echo'给出了正确的结果。我没有在SQL中收到任何错误。相反,我没有从SQL查询中获得任何结果。我的意思是在最后一行回声。

2 个答案:

答案 0 :(得分:3)

不要这样做,它会破坏你的关系模型并且不安全。

而不是拥有包含IDcolumnAcolumnBcolumnCcolumnDcolumnE列并让用户选择的表格然后,A/B/C/D/E会选择该列,其表格包​​含三列IDTYPEcolumn并且TYPEA/B/C/D/E。这样也可以在不修改表格的情况下更轻松地添加F/G/H/I

其次,使用额外的列方法,您不必从这样的输入值构建SQL。您可以使用预准备语句,并且可以安全地使用SQL注入。从未经过滤的字符串构建SQL是错误的,而且非常危险。 让您的网站遭到入侵。

答案 1 :(得分: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?

了解更多详情。