我目前正在开发一个可以通过用户输入对数据库表进行排序的脚本。
因此,用户可以选择一个列(通过selectbox),然后应该按照selectbox值的顺序显示整个mysql表。
我当前的代码($order
是用户输入)
很抱歉这种格式化,我在移动设备上:/
$order = "user_id"; //user input
$sql = $db->prepare("SELECT user_id, username, realname, auth_lvl, usercolor, activated, ban FROM users ORDER BY ?");
$sql->bind_param('s', $order);
$sql->execute();
$sql->bind_result($id, $username, $realname, $auth_lvl, $usercolor, $activated, $ban);
$sql->store_result();
while ($sql->fetch()) {
//echo...
}
问题
$order
(ORDER BY部分)是什么并不重要,我总是得到这个id的顺序:3,4,5,30,29
答案 0 :(得分:1)
如果输入参数是' foo',那么您的SQL等同于
SELECT user_id, username, realname, auth_lvl, usercolor, activated, ban
FROM users
ORDER BY 'foo'
这当然意味着行可以按任何顺序排列。您不能使用order by
子句和表名等参数。在这种情况下,您需要将列的值实际前缀为字符串。
$q = 'SELECT user_id, username, realname, auth_lvl, usercolor, activated, ban FROM users ORDER BY ' . $order;
这显然容易出现SQL注入,因此您需要手动确保列名有效:
$valid_col = in_array($order, ['username', 'realname', ...], true);
如果结果为真,则只执行查询。