MySQL ORDER BY Datetime在PHPMyAdmin中有效,但在PHP中无效

时间:2019-03-21 15:57:03

标签: php mysql

当我在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();

1 个答案:

答案 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