我正在进行这样的查询:
$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查询中获得任何结果。我的意思是在最后一行回声。
答案 0 :(得分:3)
不要这样做,它会破坏你的关系模型并且不安全。
而不是拥有包含ID
,columnA
,columnB
,columnC
,columnD
,columnE
列并让用户选择的表格然后,A/B/C/D/E
会选择该列,其表格包含三列ID
,TYPE
,column
并且TYPE
为A/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?
了解更多详情。