ORDER BY准备好的陈述

时间:2015-07-30 22:33:42

标签: php mysql prepared-statement

我目前正在开发一个可以通过用户输入对数据库表进行排序的脚本。

因此,用户可以选择一个列(通过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

1 个答案:

答案 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);

如果结果为真,则只执行查询。