ORDER BY变量问题


ORDER BY Variable issues

在MSSQL查询中将变量传递给ORDER BY(通过PHP)时遇到问题,这里的代码是:

    <?php
include "connection.php";
$type = $_POST['type'];
$order = $_POST['order'];
$data = $_POST['data'];
$params="@order varchar(10)";
$paramslist="@order=$order";
$sql = "SELECT * FROM Customer ORDER BY "+@order;
$dbsql = "EXEC sp_executesql
N'$sql',
N'$params',
$paramslist";
$result = sqlsrv_query($link, $dbsql);
if ($result) {
echo "OK";
} else {
echo "FAIL - " . $order . " -- ";
die(print_r(sqlsrv_errors(), true));
}
?>

我得到以下错误回显到浏览器:

FAIL-CompanyName-数组([0]=>数组([0]=>42000[SQLSTATE]=>42000[1] =>102[代码]=>102[2] =>[Microsoft][SQL Server Native Client 10.0][SQL Server:"0"附近的语法不正确。[message]=>[Microsoft][SQL Server Native Client 10.0][SQL Server:"0"附近的语法不正确。))

到目前为止的检查:

  • 所有POST变量都具有所需的数据
  • SQL表名正确,$order中的数据等于正确的列名

我到处找了找,但找不到任何有用的东西,有人能帮忙吗?

谢谢。

编辑:

好的,所以代码现在是:

$params="@order varchar(10)";
$paramslist="@order=$order";
$sql = "SELECT * FROM Customer ORDER BY ".$order;
$dbsql = "EXEC sp_executesql
N'$sql',
N'$params',
$paramslist";
$result = sqlsrv_query($link, $dbsql);

它工作得很好,但这会让它容易受到SQL注入攻击吗?有什么更好的方法来执行这个查询吗?

感谢您的帮助。

您可以通过使用订单的代码来处理Sql注入,例如,您向自己发布1、2、3、4等,这些代码在代码中转换为正确的列名。如果发布的代码与您的查找不匹配,则忽略它。

您尝试过使用吗

$sql = "SELECT * FROM Customer ORDER BY  @order";

由于这不起作用,最好的方法是使用准备好的语句,我认为

$stmt = $dbh->prepare("SELECT * FROM Customer  WHERE value = ? ORDER BY ?");
if ($stmt->execute(array($_POST['value'], $_POST['order']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}