我不是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排序。我不知道为什么。
答案 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,并且您具有完全控制权,而没有外部输入。