PDO查询似乎正在返回DESC顺序。忽略ASC硬代码

时间:2018-08-13 01:30:05

标签: php mysql pdo

我不是PDO的新手,所以也许有些微妙的细微差别我不知道。但是我有一个查询,应该按日期ASC列出驱动程序。在工作台中进行测试时,代码以正确的方式运行,即ASC,因此我知道测试表数据是可靠的;但是,当我在PDO中运行以下代码时,它没有显示任何错误并返回记录,但是我看到DESC订单的结果不是按预期的那样是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_date和$ count。

有人知道它可能是什么吗?

更新

我发现它正在按主索引driverid排序。我不知道为什么。

2 个答案:

答案 0 :(得分:1)

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

$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();

答案 1 :(得分:0)

您正在按常量表达式而不是列进行排序,因此排序顺序基本上是任意的(甚至不是随机的)。

如果要将代码插入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,并且您具有完全控制权,而没有外部输入。