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吗?在不同的情况下(即,美国