2015-10-16 77 views
1

我们目前有一个系统,我们有一个检查日期/时间冲突的函数,我们手动将所有可能的日期/时间冲突填充为参数。如何检查时间/日期冲突(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. '; 
     } 

其非常繁琐,而且耗费时间来查找这些以及手动填充的功能/ PARAMS ..

我需要一种新的方法!我希望只是得到一个冲突的列表,并突出显示页面上的(表格)行,并提供有关您在突出显示的区域中存在冲突的消息(较少具体,然后提供确切时间..等等,仍然获得工作用户完成)

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

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)

随着会议日期的数据看起来像:2015年9月9日

和呈现实时数据看起来像: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函数(即使选择已保存)不会让用户前进,直到错误(s)消息被照顾(因此更新表时再次冲突得到解决)..

我想我将不再需要使用chkConflict方法,并改变recordHours函数不仅更新表..但因为它有'fieldlist'数组被张贴..我需要做冲突检查那里以及...或可能调用recordHours另一个函数并传递相同的字段列表...

列数据并不真正用于s活动或(当前)冲突检查... NAME列。

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

重新盖:字段列表和列名命名,如:

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中的字符串解析(在字段列表名称上)并对其进行转换/检查?

我需要把字符串拆分成它的部分,并对它进行某种(连接/字符串构建)比较?

基本上我收到提交的字段被格式化为上面和匹配表的列名的列表...

我如何可以通过这个字段列表一样到一个新的功能(或其他)获得任何冲突回来?

回答

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); 

例如...

+0

谢谢... 看来(我越看看它,如上所述)我需要可能做到这一点在PHP的一些事情..使用字段列表数组,而不是/作为MySQL函数.. 我也不认为你的例子真的与当前的项目一致。 从用户选择的1-x复选框中可以找到任何地方..然后发送这些(fieldlist数组)以保存表格。 我需要检查是否有任何列表冲突。我没有选择一个..他们选择了很多。 – whispers

+0

嗯..你可能是正确的,在经过更多的思考之后,fieldlist-array的名字可能不能被使用,因为没有任何结束时间可用于任何事情。 也许在END时间添加字段列表名称会有帮助吗? 我试图找到一种避免手动查看会话时间的方法,并将它们添加到函数中,以查看是否选择了它们中的任何一个来报告冲突..其非常......我不知道“手动“?大声笑 – whispers