php - MySQL ORDER BY Datetime 适用于 PHPMyAdmin 但不适用于 PHP

标签 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();

最佳答案

? 绑定(bind)占位符位于 SQL 语句中的 value 位置。它不是标识符。当绑定(bind)一个值并执行语句时,问号将替换为一个

结果就好像我们这样做了:

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

关于php - MySQL ORDER BY Datetime 适用于 PHPMyAdmin 但不适用于 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55284490/

相关文章:

php - 获取 UTF-8 字符串的第一个字符

MySQL每个用户的选择计数(如果大于3)

utf-8 - 从不同的字符集导出/导入 MySQL

php - 查找字符串中的单词

php - 将 mySQL 导出到 excel 或 csv

php - Mysql实时消息

php - 通过 jQuery AJAX 传递表单数组数据

php - 代码点火器 :- get monthy recap report

php - 确定地理位置是否是搜索字符串的子字符串

php - Mysql 计数和按日期分组