如何检查时间/日期冲突(PHP/MySQL)


How to check for time/date conflicts (PHP/MySQL)

我们目前有一个系统,其中我们有一个检查日期/时间冲突的函数,我们手动将所有可能的日期/时间冲突作为参数填充到。

ie:

//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. ';
        }

非常繁琐,查找这些和手动填充函数/参数非常耗时。

我需要一个新的方法!我希望只是得到冲突的列表回来,并突出显示(表)行在页面上的消息,你有冲突在突出显示的区域(不太具体,然后给出一个确切的时间…等等,并且仍然为用户完成工作)

所有的用户交互都是通过复选框完成的,复选框的名称反映了表中的列:

ie:

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 AM - 9:05 AM(不确定这是否重要,但为了充分披露,包括它)

我对数据库没有太多的控制,但我可能会把时间分成两列(开始/结束),如果这是最好的?

在任何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中调用另一个函数并传递相同的字段列表…

列数据不是真正用于保存或(当前)任何类型的冲突检查…

我的问题是我不确定如何去做日期/时间冲突检查?

re-cap: fieldlist和列名被命名为:

ie:  hours_5_p02_800, hours_5_p03_800, hours_5_p07_800,hours_5_p04_800,hours_9_reg_session_300_845

(并且是24小时格式的时间)

ex: hours_9_reg_session_300_845

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

在思考更多,它更像是我需要做某种类型的字符串解析在PHP(在字段列表名称)和做转换/检查?

我需要取字符串,将其分解成各个部分,并对其进行某种(连接/字符串构建)比较?

基本上,我得到了提交的字段列表,这些字段的格式如上所述,并且与表的列名相匹配…

我怎么能传递这个相同的字段列表到一个新的函数(或任何)得到任何冲突回来?

既然您似乎有机会改变一些事情,我建议您创建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);
例如…