Как сравнить эти даты в MYSQL?

Я уже гуглил и, таким образом, также много искал по этому поводу stackoverflow, но чем больше я искал, тем больше "?" выскочило у меня перед глазами, и я должен признать, что чувствую, что не могу собрать все эти вещи воедино самостоятельно, поэтому я надеюсь, что смогу сформулировать свои мысли здесь достаточно хорошо, чтобы вы могли помочь мне в этом... ^ ^

Итак, я хочу сравнить диапазоны дат, введенные пользователем, с диапазонами дат, хранящимися в моей базе данных MYSQL в формате «2019-02-02 00:00:00». Да, все даты в БД установлены на полночь.

Диапазон дат, поступающий из внешнего интерфейса, был отформатирован на стороне php, чтобы напоминать эту структуру. Поэтому я взял временную метку из внешнего интерфейса и поместил ее в функцию date():

date("Y-m-d 00:00:00", $timestamp) 

Теперь, позже я выполняю SQL-запрос, с помощью которого я определяю, есть ли перекрытие между двумя диапазонами дат или нет, это выглядит так:

   $result = $connection->query("SELECT id
   FROM reservierung
   WHERE status != 'abgelehnt'
   AND benutzer != $benutzerID
   AND arbeitsplatz = $arbeitsplatzID
   AND $formattedStartDate <= ende
   AND $formattedEndDate >= anfang
   ");

Затем я оцениваю запрос следующим образом:

  $queryResult = $result->rowCount();

Но php выдает ошибку, потому что запрос не выполнен и возвращает логическое значение false. Поэтому я делаю вывод, что что-то пошло не так со сравнением дат, потому что, если я его удалю, запрос будет выполнен успешно.

Я знаю, что MYSQL хранит только строки (по крайней мере, наша БД определенно хранит), но я не знаю, какая у меня дата (строка? объект?), и я не знаю, что мне нужно преобразовать во что, чтобы это сравнение произошло хD Обычно я всегда извлекал даты и проводил сравнения вне запросов, но это намного более «подробно» и, вероятно, не нужно, если кто-то знает, как сравнивать внутри mysql. Я уже читал о DATE_FORMAT() и о том, что сравнение временных меток вместо дат тоже будет работать, но я не знаю, какой метод будет более эффективным (с точки зрения создания меньшего и лучшего структурированного кода), и опять же, я не знаю, что нужно быть тем, что внутри запроса mysql, чтобы сравнение работало только на функциональном/синтаксическом уровне... ^^

Обновлено: Вот ошибка php, просто FYI:

[Четверг, 07 февраля, 15:29:04.739350 2019] [: ошибка] [pid 20986] [клиент 127.0.0.1:47518] Неустранимая ошибка PHP: Uncaught Error: вызов функции-члена rowCount() для логического значения в /var/www/ html/include/Buchen.php:76\nТрассировка стека:\n#0 /var/www/html/include/Buchen.php(199): checkQueryResult(false)\n#1 /var/www/html/include/ Buchen.php(149): reservationConflictsWithAlreadyExistingReservationByUser(Object(PDO), '2019-02-07', '2019-02-28', '66', '145', Array)\n#2 /var/www/html /include/Buchen.php(24): checkForValidityOfReservationTimeframe(Object(PDO), Array, 'DEI3', '2', '66', '145')\n#3 /var/www/html/include/Buchen .php(11): mainframe('1549494000', '1551308400', '2', 'DEI3', 'Andreas', 'Lang', NULL)\n#4 {main}\n добавлено в /var/www /html/include/Buchen.php в строке 76, реферер: http://localhost/view/reservieren.php

Для начала AND $formattedStartDate <= ende должен быть AND '$formattedStartDate' <= ende. На самом деле это должен быть AND ? <= ende.

Salman A 07.02.2019 16:00

2019-02-02 = 2015. См. о SQL-инъекциях и важности подготовленных и связанных запросов.

Strawberry 07.02.2019 16:03

@ JSONBUG123 JSONBUG123 Я предполагаю, что вы используете какую-то библиотеку базы данных, поэтому используйте параметры вместо того, чтобы вставлять переменные $ непосредственно в запрос.

Salman A 07.02.2019 16:05
Но php выдает ошибку, потому что запрос не выполнен: какую ошибку вы получаете?
GMB 07.02.2019 16:07

Хм, что такое "библиотеки баз данных"...?^^ Это не очень "профессиональная" библиотека, так как она просто используется для внутреннего программного обеспечения, чтобы отслеживать, кто сидит на какой рабочей станции в течение какого времени. Этот подход, который вы видите здесь, используется во всем инструменте, поэтому я не знаю, использует ли наша база данных эти библиотеки или нет... ^^

JSONBUG123 07.02.2019 16:07

Неустранимая ошибка @GMB PHP: вызов функции-члена rowCount() для логического значения. Как я уже сказал, запрос завершается ошибкой, поэтому возвращается "false", который не может быть использован функцией rowCount().

JSONBUG123 07.02.2019 16:08

Вам нужно будет перехватить ошибку mysql и сообщить о ней, чтобы мы могли ее увидеть и проанализировать.

GMB 07.02.2019 16:09

Для меня совет Салмана по использованию «$ formattedStartDate» уже помог :) Обновлено: @GMB Я отредактирую ошибку php, комментарии не дают мне достаточно символов, чтобы напечатать ее здесь. Однако, как я уже сказал, проблема уже решена, потому что запрос теперь работает, и поэтому запрос не возвращает false, и поэтому rowCount() больше не получает никаких логических значений :)

JSONBUG123 07.02.2019 16:14

«Для начала, И $formattedStartDate <= ende должно быть AND '$formattedStartDate' <= ende. На самом деле это должно быть AND ? <= ende» Совет @SalmanA на самом деле не так уж хорош из-за возможных SQL-инъекций в на самом деле топикстартер должен вместо этого использовать подготовленные заявления.

Raymond Nijland 07.02.2019 16:25

Вы отредактировали ошибку PHP, возникающую в результате сбоя вызова rowCount, но нам нужно знать, почему происходит сбой запроса (как вы поняли, rowCount завершается сбоем, потому что $result имеет значение false, а не объект результата. $result значение false означает, что запрос не выполнен). Вам нужен оператор if, чтобы проверить, является ли $result === false, и если да, то повторите результат mysqli_error() (вероятно, $connection->error в вашем случае, если $connection является объектом соединения mysqli), чтобы вы могли увидеть, какую ошибку вернул SQL. Ошибка, которую вы видите, является симптомом, а не причиной

ADyson 07.02.2019 16:29

о да, вы имели в виду использование заполнителей (подготовленных утверждений) с самого начала @SalmanA, я пропустил это, я думаю, что мне очень нужен кофеин ..

Raymond Nijland 07.02.2019 19:27
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
11
44
0

Другие вопросы по теме