Конфликт событий с календарем событий MSQL и PHP - PullRequest
1 голос
/ 13 февраля 2012

Итак, я работаю над клиентским веб-сайтом, и он в основном фокусируется на календаре событий. Функции календаря: вы можете вставить события с датой, start_time, end_time. а затем его отображается в календаре, и вы получите изображение. У меня проблема в конфликтах между текущими событиями и теми, которые люди пытаются записать как новые события. Я знаю логически, мне нужно будет проверить, если это:

  1. между событиями
  2. во время мероприятия, но начинается до него
  3. во время мероприятия, но начиная с него и заканчивая позже.

SQL-запрос, который я создал для запуска, таков (он не работает):

$check_date_time = "SELECT `event_date`, `start_time`, `end_time` FROM `calendar_events` WHERE
 '.$_POST['event_date'].' = event_date AND
'.$_POST['start_time'].' BETWEEN `start_time` AND `end_time` 
AND '.$_POST['start_time'].' < `start_time` AND '.$_POST['end_time'].' < `end_time` 
|| '.$_POST['start_time'].' > `start_time` AND '.$_POST['end_time'].' < `end_time`';
$result = mysql_query($check_date_time, $mysql)
            or die(mysql_error());

Буду признателен за любую помощь, я не знаю, правильно ли я пишу запрос или база данных настроена неправильно.

Спасибо, Андрей

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Мне кажется, что вы сохраняете даты и время в текстовом поле / в varchar и пытаетесь использовать оператор BETWEEN, который работает только с полями даты / числа.

Запустите этот запрос: SHOW CREATETABLE calendar_events;

И опубликуйте результаты для нас, чтобы мы могли увидеть структуру вашей таблицы.

Также я должен отметить, что размещение данных $ _POST напрямую вSQL-запрос очень плохая идея при любых обстоятельствах.Вот так вы подвергаетесь атакам SQL-инъекций и подвергаете риску всю свою базу данных.

Вы должны использовать вспомогательный класс или, по крайней мере, вызвать mysql_escape_string или использовать метод escape для mysqli вокруг каждого элемента данных.Также убедитесь, что вы заключили параметры в запрос в одинарные кавычки.Вы также должны заключить имена таблиц / столбцов в обратные черты (`).Несмотря на то, что они технически необязательны, это помогает при чтении запросов и позволяет избежать ошибок, вызванных конфликтом данных / полей.

Например, если я отправил «event_date» в качестве данных для $ _POST ['event_date']MySQL будет сбит с толку, поскольку он будет интерпретировать эту часть запроса как event_date = event_date, что, конечно, будет всегда истинно.

При правильном использовании одинарных кавычек и обратных кавычек: 'event_date '= event_date Теперь MySQL знает, что первое вхождение говорит ему искать случаи, когда значение event_date присутствует в столбце event_date таблицы.

В любом случае, отправьте обратно структуру таблицыпоместите ваши кавычки в одиночку / обратные кавычки, и я думаю, что нам будет гораздо легче помочь вам.

0 голосов
/ 22 февраля 2012

@ Брайан - это то, что я использовал, чтобы заставить его работать, спасибо за ваши советы, помощь и понимание

$check_date_time = "SELECT * FROM calendar_events` WHERE id IN (SELECT id FROM  
calendar_events WHERE (event_date_start <= '$event_date_start' AND event_date_end >=   
'$event_date_start') OR (event_date_start <= '$event_date_end' AND event_date_end >=
'$event_date_end') OR (event_date_start >= '$event_date_start' AND event_date_end <=  
'$event_date_end'))"; $result = mysql_query($check_date_time, $mysql) or 
die(mysql_error()); 
if(mysql_num_rows($result) > 0) {} 

начало и конец события - это столбцы даты / времени в моей базе данных, и я проверяю, соответствует ли «id» (строка) какому-либо из условий, если это так, он останавливает пользователя и отображает уведомление о том, что событие существует в этом слоте. Но это позволяет проводить более одного события в день.

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