Как проверить наличие времени / даты конфликтов (PHP / MySQL)

В настоящее время у нас есть система, в которой есть функция, которая проверяет конфликты даты и времени, для которой мы вручную заполняем все возможные конфликты даты / времени в качестве параметров.

то есть:

//session conflicts checker
function chkConflicts($sessions) {
if (!is_array($sessions)) {
$arrsessions = explode(',', $sessions);
} else {
$arrsessions = $sessions;
}
$conflictcount = 0;
foreach ($arrsessions as $thissession) {
if (($_POST[trim($thissession)] != '' && $_POST[trim($thissession)] != 0) || $_POST[trim($thissession) . '_faculty'] != '' && $_POST[trim($thissession) . '_faculty'] != 0) {
$conflictcount++;
}
}
if ($conflictcount > 1) {
return false;
} else {
return true;
}
}

использовал вот так:

if (!chkConflicts('hours_5_p02_800, hours_5_p03_800, hours_5_p07_800, hours_5_p04_800')) {
$errmsg .= 'There is a conflict at 8:00am in the selections. ';
}

это очень утомительно и требует много времени, чтобы найти их, а также вручную заполнить функции / параметры.

Мне нужен новый подход! Я надеюсь просто вернуть список конфликтов и выделить строку (таблицы) на странице с сообщением о том, что у вас есть конфликты в выделенных областях (менее конкретным, чем указание точного времени … и т. Д., И по-прежнему получать работа сделана для пользователя)

Все взаимодействие с пользователем осуществляется с помощью флажков, имена которых соответствуют столбцу в таблице:

то есть:

hours_5_p02_800, hours_5_p03_800, hours_5_p07_800,
hours_5_p04_800,hours_9_reg_session_300_845

(те же имена, которые используются в функции chkConflicts выше)

У меня есть (среди прочего) две колонки: sessiondate varchar(255) & presentationtime varchar(255) С уважением.

С данными даты сеанса, выглядящими как: 9/9/2015

И данные времени представления выглядят так: 8:45 утра — 9:05 утра (не уверен, если это имеет значение, но в том числе и ради полного раскрытия)

У меня нет ALOT контроля над базой данных, но я мог бы разделить время на две колонки (начало / конец), если это будет лучше?

перед вызовом ЛЮБОЙ функции chkConflict .. «выборки» пользователя записываются / сохраняются в таблице. И затем вызывается проверка конфликта.

//record hours for each day
function recordHours() {
$arrflds = explode(',', $_POST['fieldlist']);
$sql = "UPDATE {$this->eventcode}_cme SET";
foreach($arrflds as $key) {
$sql .= " " . addslashes(trim($key)) . " = '" . addslashes($_POST[trim($key)]) . "',";
}
$sql .= " lastupdated = '" . date('Y-m-d H:i:s') . "' WHERE id = '" . $_SESSION[$this->eventcode . '_id'] . "'";
$this->debugout .= ($this->debug) ? 'Record hours: ' . $sql . '<br>' . $this->crlf : '';
$result = mysql_query($sql) or exit('Error recording hours: ' . mysql_error());
}

* Я обновляю вещи в PDO после того, как выясню конфликтные вещи. (Спасибо)

Я не возражаю против этого, потому что функция chkConflict (даже несмотря на то, что варианты были сохранены) НЕ позволяет пользователю двигаться вперед до тех пор, пока не будут обработаны сообщения об ошибках (а) (следовательно, обновление таблицы снова, когда конфликты разрешены) ..

Я думаю, мне больше не нужно использовать метод chkConflict и изменять функцию recordHours, чтобы не только обновлять таблицу … но потому, что у нее есть массив ‘fieldlist’, который был опубликован …, что мне нужно сделать там также проверяется конфликт … или, возможно, вызывается другая функция из-за recordHours и передается по тому же списку полей …

Данные столбца на самом деле не используются для сохранения или (текущей) проверки конфликтов любого рода … столбец NAME.

Моя проблема в том, что я не уверен, как пройти проверку даты / времени?

re-cap: имена полей и столбцов названы так:

ie:  hours_5_p02_800, hours_5_p03_800, hours_5_p07_800,hours_5_p04_800,hours_9_reg_session_300_845

(и это 24-часовой формат для времени)

например: hours_9_reg_session_300_845

9 = date
reg =  event code
300 = session code
845 = session time(24-hour format)

Подумав больше, все равно, что мне нужно выполнить какой-то синтаксический анализ строк в PHP (по именам fieldlist) и выполнить преобразование / проверку?

Мне нужно взять строку, разбить ее на части и выполнить какое-то (конкатенация / построение строки) сравнение с ней?

в основном я получаю список представляемых полей, которые отформатированы, как указано выше, и соответствуют именам столбцов таблицы …

Как я могу передать этот же список полей в новую функцию (или что-то еще), чтобы вернуться к любым конфликтам?

1

Решение

Поскольку у вас, кажется, есть возможность немного изменить ситуацию, я бы предложил вам создать 2 поля, но в качестве типа поля меток времени. Один для начала и один для конца.

Вы можете смотреть на поля меток времени как дату / время как 2015-10-17 08:45:00 или, используя UNIX_TIMESTAMP('2015-10-17 08:45:00')как целое число 1445064300 которая точно такая же информация о дате / времени.

В обоих случаях вы можете делать такие вещи, как

SELECT :yourdatetime BETWEEN date_time_start AND date_time_end;

или же

SELECT :yourunixlikedatetime
NOT BETWEEN UNIX_TIMESTAMP(date_time_start) AND UNIX_TIMESTAMP(date_time_end);

например…

1

Другие решения

Других решений пока нет …