我们目前有一个系统,我们有一个检查日期/时间冲突的函数,我们手动将所有可能的日期/时间冲突填充为参数。
即:
//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(不确定这是否重要,但为了充分披露而包括它)
我对数据库没有很多控制权,但如果最好的话,我可能会把时间分成两列(开始/结束)?
在调用任何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调用另一个函数并传递相同的字段列表...
列数据并不真正用于任何排序的保存或(当前)冲突检查......列名为。
我的问题是我不确定如何进行日期/时间冲突检查?
重新上限:字段列表和列名称命名为:
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中进行某种字符串解析(在字段列表名称上)并对其进行转换/检查?
我需要获取字符串,将其分解为部分并对其进行某种(连接/字符串构建)比较吗?
基本上我得到了上面格式化的提交字段列表,并匹配表列名...
如何将同一个字段列表传递给新函数(或其他任何东西)以解决任何冲突?
答案 0 :(得分: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);
例如......