pdo查询似乎正在返回desc order忽略asc硬代码

crcmnpdw  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(479)

我是pdo的新手,所以可能有些微妙的细微差别,我不知道。但是我有一个查询应该是按日期asc列出司机。代码的工作方式是正确的,当我在工作台上测试时,asc,所以我知道测试表数据是可靠的;但是当我在pdo中运行下面的代码时,它不会显示任何错误并返回记录,但是我看到的是descorder的结果,而不是预期的asc。代码如下:

$selectsql = "SELECT driverid, busid, firstname
FROM drivers 
WHERE active= 1 
AND day= 1
ORDER BY ? ASC
LIMIT ? ";

$results = $pdo->prepare($selectsql);
$results->execute([$list_date,$count]);

$row = $results->fetchAll();

我没有得到错误和数据返回。只是不符合预期。我做了检查,两个变量$list\u date和$count设置正确。
有人看到了吗?
更新
我发现它是按主索引driversid排序的。我不知道为什么。

flmtquvp

flmtquvp1#

我认为不能使用字段名作为准备语句的参数。您可以将代码更改为以下内容:

$selectsql = "SELECT driverid, busid, firstname
    FROM drivers 
    WHERE active= 1 
    AND day= 1
    ORDER BY " . $list_date . " ASC
    LIMIT ? ";

$results = $pdo->prepare($selectsql);
$results->execute([$count]);

$row = $results->fetchAll();
gkn4icbw

gkn4icbw2#

您是按常量表达式排序,而不是按列排序,因此排序顺序基本上是任意的(甚至不是随机的)。
如果要将代码注入到sql语句(例如列名)中,则需要使用好的旧字符串操作函数。准备好的报表是为了避免:

$selectsql = "SELECT driverid, busid, firstname
    FROM drivers 
    WHERE active= 1 
    AND day= 1
    ORDER BY $list_date ASC
    LIMIT ? ";
$results = $pdo->prepare($selectsql);
$results->execute([$count]);
$row = $results->fetchAll();

确保 $list_date 是您完全控制的有效sql,而不是外部输入。

相关问题