2017-02-24 3 views
1

Entschuldigung, wenn diese Frage albern sein könnte, aber ich bin relativ neu in der Programmierung. Ich habe eine Reservierungsfunktion in meiner Website und ich habe meine eigene Formularvalidierung (MY_Form_validation) erstellt, um zu überprüfen, ob ein Slot für eine bestimmte Stunde des Tages belegt wurde. Ein Benutzer wählt die Stunde aus, zu der er die Reservierung starten möchte, und die Stunde, zu der er die Reservierung beenden soll, wie unten gezeigt. enter image description hereCodeigniter - Foreach nur 1 Zeile zurückgeben

Grundsätzlich sind die Reservierungen von 10:00 Uhr bis 1:00 Uhr morgens. In der Form sind die Werte der Stunden wie folgt: 10:00 = '10', 11:00 = '11', 12:00 = '12', 1:00 = '13', 2:00 = ' 14' 25 ‚... 01.00 =‘

enter image description here I erzeugt ein Array, die als Schalter dienen, wenn die Stunde reserviert wurde. Was ich getan habe, war eine foreach zu erstellen, um alle Zeilen mit dem bestimmten Datum zu erhalten, und eine While-Schleife zu erstellen, die die Arrays "umschaltet", um einen genommenen Slot für die Stunde zu simulieren. Was passiert, ist, dass die foreach-Schleife nur die erste Zeile liest, so dass das Array nur von der ersten Zeile und nicht von den anderen Zeilen modifiziert wird.

Beispiel: (Bezieht sich auf die obige Tabelle) Wenn ich für die Stunden reserviere, die Anfangswert als 17 und Endwert als 19 haben, dann funktioniert die Validierung und es gibt die Meldung "Zeitplan wurde bereits gebucht" zurück. da es die erste Reihe ist. Wenn ich jedoch für die Stunden reserviere, die den Startwert als 11 und den Endwert als 14 (zweite Zeile) haben, funktioniert die Validierung nicht und die Reservierung läuft durch. Wie mache ich das richtig? Danke vielmals!

Form Validation Funktion:

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

es jetzt behoben, dummen Fehler. Ich beschränkte das Abfrageergebnis auf nur 1 Zeile und bemerkte es nicht. Danke Leute. – coderszx

Antwort

0

die Sie interessieren für die Anzeige mehrerer Zeilen

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

Ich habe versucht, meinen Code durch den obigen zu ersetzen, und es drängt immer noch durch:/ – coderszx

0

Versuchen Sie diese Methode:

$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

Versuchte den Code oben und die Reservierung drängt sich noch durch:/ – coderszx

0

1) Können Sie sich mit Ihrer Anfrage Ergebnisse überprüfen gesetzt . Müssen Sie überprüfen, was genau die Resultset-Abfrage zurückgibt (Gibt sie alle Zeilen oder nur eine Zeile zurück) mit result_array(). Wenn Sie weitere Details zu Ihrer Abfrage haben können, fügen Sie einfach die Zeile nach Ihrer Abfrage ein.

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

Es wird Ihnen genaue Abfrage geben. Mit Query erhalten Sie die Idee, wo Sie falsch liegen.

2) Wenn seine Rückkehr alle Zeilen, dann müssen Sie mit Ihrem foreach-Schleife überprüfen und

+0

SELECT * FROM 'clubhouse_reservation' WHERE' reservation_date' = '02/24/2017 ' UND 'reservation_status' = 1 Dies ist, was angezeigt wird – coderszx

+0

Yup also nur überprüfen, ist Ihre Abfrage alle Zeilen zurückgeben? Sie können dies mit $ checkresult-> result_array() überprüfen; . Wenn es alle Zeilen zurückgibt, muss es mit Schleifen überprüft werden. –

Verwandte Themen