当我在PHPMyAdmin中运行此查询时
SELECT * FROM tbl_events WHERE start_datetime > CURDATE() ORDER BY start_datetime ASC;
我得到这个结果
2019-08-19 07:30:00
2020-03-21 06:30:00
2020-04-30 07:30:00
2020-07-30 07:30:00
尽管当我在网站上运行查询时,返回的顺序是将行写入表的顺序。
2020-07-30 07:30:00
2020-05-02 07:30:00
2020-04-30 07:30:00
2020-03-21 06:30:00
2019-08-19 07:30:00
原始PHP:
$search = "%" . $search . "%";
echo "The sort type is: " . $sortType . "<br>";
// fetch events
$stmt = $this->conn->prepare("SELECT * FROM tbl_events WHERE LOWER(event_name) LIKE LOWER(?) AND start_datetime > CURDATE() ORDER BY ? ASC;");
$stmt->bind_param("ss", $search, $sortType);
$stmt->execute();
$eventResult = $stmt->get_result();
if (isset($stmt->errno)) {
if ($stmt->errno != 0) {
echo "An error occured! Error Number: " . $stmt->errno . "<br> Error message: " . $stmt->error;
}
}
$stmt->close();
答案 0 :(得分:0)
在SQL语句中,?
绑定占位符位于 value 的位置。它不是标识符。绑定值并执行该语句后,问号将替换为 value 。
结果就好像我们已经做到了:
SELECT e.*
FROM tbl_events e
WHERE e.start_datetime > CURDATE()
ORDER BY 'start_datetime' ASC;
^ ^
请注意单引号。那是一个字符串文字,一个值。没有对列的引用。不管传递什么值,每一行都会相同。
要基于传入的值使列上的排序,我们可以执行以下操作:
ORDER
BY CASE ?
WHEN 'start_datetime' THEN e.start_datetime
WHEN 'something_else' THEN someothervalidexpression
END
ASC