变量传递给ORDER BY?

时间:2014-05-22 13:58:34

标签: php mysql sql

我使用以下查询:

$result = "SELECT mgap_ska_id, mgap_ska_id_name, SUM(DISTINCT mgap_growth) as growthtotal, SUM(DISTINCT mgap_recovery) as recovery FROM mgap_orders "
        . "WHERE account_manager_id = '" . $_SESSION['account_manager_id'] . "'  GROUP BY mgap_ska_id ORDER BY '$sort' ";

我正在尝试使用我可以通过URL传递的变量来定义ORDER BY,如下所示:

$sort = mysql_real_escape_char($_GET['sort'])

如何在查询字符串中正确转义?我想我的报价不正确。

谢谢!

4 个答案:

答案 0 :(得分:3)

语句排序不用单引号括起来:

"... GROUP BY mgap_ska_id ORDER BY $sort ";

话虽如此,简单地接受用户数据并将其插入到查询中真的很危险 - 真正的逃避与否。

如果 允许用户选择排序,我建议给他们选项,但强制你的OWN代码生成子句:

switch($userSort)
{
    case 'id':
        $sort=' id asc';
        break;
    case 'dollarValue':
        $sort=' dollarValue desc';
        break;
    default:
        $sort=' dateField desc';
}

然后使用变量:

"... GROUP BY mgap_ska_id ORDER BY $sort ";

这样,无论用户输入什么内容,都不会使您的查询失败。

答案 1 :(得分:1)

不要引用order by中的变量:

ORDER BY '$sort' 
         ^-----^---

添加这样的引号会强制数据库将$sort中的任何内容视为STRING,而不是字段名称。这是完全有效的SQL,因为您可以对任意表达式进行排序,但它不会对您的记录进行正确排序。

应该只是

ORDER BY $sort

答案 2 :(得分:1)

就“正确转义”而言,确保代码安全的唯一真正正确的方法是确保您所包含的变量是您指定的变量,例如:

if('growthTotal' == $_GET['sort']) {
    $sort = 'growthTotal';
}

然后在您的查询中包含$ sort,因为该值来自您的代码,因此您可以保证其安全。

答案 3 :(得分:0)

SORT BY预测列名,而不是值。所以你不要在那里使用"但是只有(如果需要的话,是可选的)反引号`如果你使用表名也是保留字。

另外,最好不要从GET获取列名,而是根据用户发送的订单在代码中替换它,因为目前我可以提供您想要的查询(无效的列名,或列我想要的,不是你)