我们目前有一个系统,其中我们有一个检查日期/时间冲突的函数,我们手动将所有可能的日期/时间冲突作为参数填充到。
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);
例如…