2015-10-16 262 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