2017-02-24 114 views
1

對不起,如果這個問題可能很愚蠢,但我相對比較新的編程。我在我的網站上有一個預訂功能,我創建了我自己的表單驗證(MY_Form_validation),以檢查是否在一天中的特定時間段內進行了插入。用戶選擇他們想要開始預定的時間,並且他們想要結束它的時間如下所示。 enter image description hereCodeigniter - Foreach只返回1行

基本上,保留是從早上10點到凌晨1點。在表格中,小時值如下:10:00 = '10',11:00 = '11',12:00 = '12',1:00 = '13',2:00 =' 14'... 1:00 ='25'

enter image description here 我創建了一個數組,該數組在每小時保留時用作開關。我所做的就是創建一個foreach來獲取所有具有特定日期的行,然後創建一個while循環來切換數組,以便模擬一個小時內的某個時隙。會發生什麼是foreach循環只讀取第一行,所以數組只被第一行而不是其他行所修改。例如:(參考上面的sql表格) 如果我保留起始值爲17,最終值爲19的小時,那麼驗證工作並返回「時間表已經被預訂」的消息,因爲它是第一行。但是,如果我保留起始值爲11和最終值爲14(第二行)的小時數,則驗證不起作用,並且預約會通過。 我該如何正確地做到這一點?非常感謝!

表單驗證功能:

function unique_reserve_clubhouse() 
{ 
    $reservedate = $this->CI->input->post('datepick'); 
    $reservestart = $this->CI->input->post('reservestart'); 
    $reserveend = $this->CI->input->post('reserveend'); 

    $checkstart = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_start' => $reservestart, 'reservation_status' => 1), 1); 

    $checkresult = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_status' => 1)); 
    $resultreserve = $checkresult->result(); 
    $tdX = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); 

    foreach($resultreserve as $result) 
    { 
     while($result->reservation_start < $result->reservation_end) 
     { 
      $tdX[$result->reservation_start] = 1; 
      $result->reservation_start++; 
     } 
    } 

    if($checkstart->num_rows() > 0 || $tdX[$reservestart] == 1 || $tdX[$reserveend] == 1) { 

     $this->set_message('unique_reserve_clubhouse', 'This time schedule is already booked.'); 

     return FALSE; 
    } 

    return TRUE; 
} 
+0

修復它現在,愚蠢的錯誤。我只是將查詢結果限制爲1行,並沒有注意到它。多謝你們。 – coderszx

回答

0

嘗試此觀看多行

function unique_reserve_clubhouse() 
{ 
$reservedate = $this->CI->input->post('datepick'); 
$reservestart = $this->CI->input->post('reservestart'); 
$reserveend = $this->CI->input->post('reserveend'); 

$checkstart = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_start' => $reservestart, 'reservation_status' => 1), 1); 

$checkresult = $this->CI->db->get_where('clubhouse_reservation', array('reservation_date' => $reservedate, 'reservation_status' => 1), 1); 
$resultreserve = $checkresult->result(); 
$tdX = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); 

foreach($resultreserve as $key => $value) 
{ 
    echo $key.''.$value; //Here i have put echo so that you can check it here only. 
} 

if($checkstart->num_rows() > 0 || $tdX[$reservestart] == 1 || $tdX[$reserveend] == 1) { 

    $this->set_message('unique_reserve_clubhouse', 'This time schedule is already booked.'); 

    return FALSE; 
} 

return TRUE; 
} 
+0

我嘗試用上面的代碼替換我的代碼,並且它仍然通過:/ – coderszx

0

試試這個方法:

$condition = "reservation_date ='" .$reservedate . "'"; 
$this -> db -> select('*'); 
$this -> db -> from('clubhouse_reservation'); 
$this -> db -> where($condition); 
foreach($query -> result() as $record){ 
if($record->reservation_start >= $reservestart && $record->reservation_end <= reserveend){ 
    //Has someone reserved  
    break; 
} 
} 
+0

嘗試了上面的代碼,並保留仍然推進:/ – coderszx

0

1)您只需要檢查與設置您的查詢結果。需要檢查result_array()返回的結果集查詢究竟返回了什麼(它是返回所有行還是隻返回1行)。如果可以有更多關於查詢的細節,只需在查詢語句之後放置下面的行。

 echo $this->CI->last_query(); die;

它會給你確切的查詢。通過查詢,您可以瞭解出錯的地方。

2)如果它返回所有行,那麼你需要檢查你的foreach循環和

+0

SELECT * FROM'clubhouse_reservation' WHERE'reservation_date' = '02/24/2017' AND'reservation_status' = 1 這是什麼顯示 – coderszx

+0

是的,所以只是檢查是你的查詢返回所有行?你可以用$ checkresult-> result_array()來檢查它。 。如果它返回所有行需要檢查循環。 –