Php 传递给ORDER BY的变量?

Php 传递给ORDER BY的变量?,php,mysql,sql,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

我正在使用以下查询:

$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' ";
我正在尝试使用一个变量定义ORDER BY,该变量可以通过URL传递,如下所示:

$sort = mysql_real_escape_char($_GET['sort'])
我如何在查询字符串中正确转义它?我想我的报价做得不对


谢谢

Order by语句没有用单引号括起来:

"... GROUP BY mgap_ska_id ORDER BY $sort ";
话虽如此,简单地接受用户数据并将其插入到查询中是非常危险的——不管是否真正转义

如果您必须允许用户选择排序,我建议为它们提供选项,但强制您自己的代码生成子句:

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 ";

这样,无论用户输入什么,它都不会阻止您的查询。

Order by语句不会用单引号括起来:

"... GROUP BY mgap_ska_id ORDER BY $sort ";
话虽如此,简单地接受用户数据并将其插入到查询中是非常危险的——不管是否真正转义

如果您必须允许用户选择排序,我建议为它们提供选项,但强制您自己的代码生成子句:

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 ";

这样,无论用户输入什么,它都不会阻止您的查询。

不要引用
顺序中的变量:

ORDER BY '$sort' 
         ^-----^---
添加这样的引号会迫使DB将
$sort
中的内容视为字符串,而不是字段名。这是完全有效的SQL,因为您可以对任意表达式进行排序,但它不会对记录进行正确排序

它应该是公正的

ORDER BY $sort

不要按顺序引用
中的变量

ORDER BY '$sort' 
         ^-----^---
添加这样的引号会迫使DB将
$sort
中的内容视为字符串,而不是字段名。这是完全有效的SQL,因为您可以对任意表达式进行排序,但它不会对记录进行正确排序

它应该是公正的

ORDER BY $sort

按排序
应为列名,而不是值。因此,如果您使用表名(也是保留字),则不在那里使用
”,而只使用(在需要时可选)反勾号


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

按排序
需要列名,而不是值。所以您不使用
如果您使用的表名也是保留字,则只有(需要时可选)反勾号


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

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

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

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

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

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

然后在你的查询中包括$sort,因为值来自你的代码,所以你可以保证它的安全。

不要偷懒,创建像
?sort=id\u desc
这样的链接,然后将其转换为sqldon't lazy,创建像
?sort=id\u desc
这样的链接,然后将其转换为SQLURL中如何指定?W] 我试图用通过URL传递的变量对我的列进行排序,但是我必须为访问页面而不是从链接的用户预先建立变量。这里是我现在拥有的:如果($\u SERVER['REQUEST\u METHOD']='POST'){$sort=$\u GET['orderBy'];}或者{$sort='mgap\u ska\u id'}您不应该有来自url的变量;这是不安全的。您必须计算出它可以接受的可能值,然后用与上面if语句相同的方法检查每个可能值。对于其他语句,请使用else ifs。然后要有一个默认值('mgap_ska_id',在你的情况下),有一个else语句。Philip,如果用户点击链接对数据进行排序,我如何传递变量?正如我在说明中所说的,你根据用户给你的输入选择变量,但不要直接获取$\u GET['sort']的值。好的……我到了,但我想重做我必须做的事情,让它更安全。如果链接是内部的,并且用户位于同一页面上,并且必须单击链接来设置值;变量是如何到达那里的?我喜欢下面Fluffeh的解决方案,但仍然不知道如何在不传递变量的情况下设置$userSort。我如何在URL中指定这样的值?W] 我试图用通过URL传递的变量对我的列进行排序,但是我必须为访问页面而不是从链接的用户预先建立变量。这里是我现在拥有的:如果($\u SERVER['REQUEST\u METHOD']='POST'){$sort=$\u GET['orderBy'];}或者{$sort='mgap\u ska\u id'}您不应该有来自url的变量;这是不安全的。您必须计算出它可以接受的可能值,然后用与上面if语句相同的方法检查每个可能值。对于其他语句,请使用else ifs。然后要有一个默认值('mgap_ska_id',在你的情况下),有一个else语句。Philip,如果用户点击链接对数据进行排序,我如何传递变量?正如我在说明中所说的,你根据用户给你的输入选择变量,但不要直接获取$\u GET['sort']的值。好的……我到了,但我想重做我必须做的事情,让它更安全。如果链接是内部的,并且用户位于同一页面上,并且必须单击链接来设置值;变量是如何到达那里的?我喜欢下面Fluffeh的解决方案,但仍然不知道如何在不传递变量的情况下设置$userSort。那么$userSort会来自URL吗?在不同的情况下(即,美国