#php #mysql
#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. Можете ли вы добавить PHP-код, который вы используете для этого результата?
2. замените ваши изображения обычным текстом
3. Вы не можете привязать имена столбцов. Ваш заказ по не будет работать.
4. Спасибо, я попробую альтернативный метод
5. вы не можете этого сделать
ORDER BY ?
с помощью подготовленного оператора. Подготовленные инструкции не работают, когда вы вводите имена столбцов через параметры.
Ответ №1:
Заполнитель ?
bind находится на месте значения в инструкции SQL. Это не идентификатор. Когда значение привязано и инструкция выполнена, знак вопроса заменяется на значение.
Результат такой, как если бы мы сделали это:
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