2017-02-24 7 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を作成し、1時間に撮影されたスロットをシミュレートするために配列を '切り替える' whileループを作成することでした。 foreachループは最初の行のみを読み取るため、配列は最初の行でのみ変更され、他の行では変更されません。

例:(上記のSQLテーブルを参照してください) 開始値が17、終了値が19の時間を予約すると、検証が機能し、「タイムスケジュールはすでに予約されています」というメッセージが返されます。これは最初の行であるためです。ただし、開始値が11、終了値が14(2行目)の時間を予約すると、検証が機能せず、予約がプッシュされます。 これを正しく行うにはどうすればよいですか?どうもありがとう!

フォーム検証機能:

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()で確認できます。 。そのすべての行を返す場合ループでチェックする必要があります。 –

関連する問題