ugrás a tartalomhoz

foglalt es szabad szobak kilistazasa

juhasztibi · 2012. Jan. 17. (K), 15.49
Sziasztok!

Szeretnek toletek segitseget kerni, mert mar sokmindent megprobaltam, de nem lelek ra a megfelelo logikara amivel a kovetkezo poblemat meg tudnam oldani:

Van nekem 2 tablam:

rooms:
CREATE TABLE  `motel`.`rooms` (
  `idrooms` int(11) NOT NULL AUTO_INCREMENT,
  `roomnumber` int(11) NOT NULL,
  `idroomparameters` int(11) NOT NULL,
  `floor` int(11) NOT NULL,
  `description` text NOT NULL,
  PRIMARY KEY (`idrooms`,`roomnumber`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1


reservations:
CREATE TABLE  `motel`.`reservations` (
  `idreservation` int(11) NOT NULL AUTO_INCREMENT,
  `idguests` int(11) NOT NULL,
  `idrooms` int(11) NOT NULL,
  `idpayment` int(11) NOT NULL,
  `fromdate` date NOT NULL,
  `todate` date NOT NULL,
  `adult` int(11) NOT NULL,
  `child` int(11) NOT NULL,
  `description` text NOT NULL,
  `restatus` int(11) NOT NULL DEFAULT '0',
  `reservationcode` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`idreservation`,`idguests`,`idrooms`,`idpayment`),
  KEY `idrooms` (`idrooms`),
  KEY `idguests` (`idguests`),
  CONSTRAINT `reservations_ibfk_1` FOREIGN KEY (`idguests`) REFERENCES `guests` (`idguests`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `reservations_ibfk_2` FOREIGN KEY (`idrooms`) REFERENCES `rooms` (`idrooms`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1


Termeszetesen sok mas tabla is van meg de azok jelen problemaban nem erintettek.
A problemam az, hogy ki kell listazni a szabad es a foglalt szobakat.
A listazas ugy nez ki, hogy megadok egy kezdeti es vegdatumot majd a ketto kozott minden napot kilistazok es az adott napokon szabad es foglalt szobakat. Nos itt az elozo mondat utolso reszenel jonnek a problemaim.

Abban az esetben ha tobb foglalas van egy szobara az intervallumon belul akkor a szoba szoba attol fuggetlenul, hogy o eppen nem is foglalt x napon csak y napon megjelenik x napon is.

Tehat:

foglalas 5-os szobara:

2012-01-10 - 2012-01-12
2012-01-15 - 2012-01-16
2012-01-17 - 2012-01-21

majd ugy kerdezem le, hogy vegigmegyek a szobakon:

SELECT idrooms, roomnumber FROM rooms


majd ezutan minden iteracioban lekerdezem az adott szoba foglalasait:

SELECT * FROM reservations LEFT JOIN rooms ON rooms.idrooms=reservations.idrooms WHERE rooms.idrooms='".$roomid."'";


es itt vissza fog jonni az 5-os szobara, hogy van neki 3db foglalasa.

Igazabol a megjelenitessel van problemam, nem tudom kilistazni, hogy csak az jelenjen meg a harom foglalasbol amelyik nekem kell.

pl:

kivancsi vagyok erre az intervallumra:

2012-01-12 - 2012-01-16

akkor kovetkezokeppen szeretnem megjeleniteni (a fentebb irt foglalasi idok alapjan):

2012-01-12 nap:
5. szoba
2012-01-13 nap:
5. szoba
2012-01-14 nap:
5. szoba
2012-01-15 nap:
5. szoba
2012-01-16 nap:
5. szoba

Nekem igy jelenik meg:

2012-01-12 nap:
5. szoba 5. szoba 5. szoba
2012-01-13 nap:
5. szoba 5. szoba 5. szoba
2012-01-14 nap:
5. szoba 5. szoba 5. szoba
2012-01-15 nap:
5. szoba 5. szoba 5. szoba
2012-01-16 nap:
5. szoba 5. szoba 5. szoba


Amivel probalkoztam, hogy belepakolom egy tombbe az a foglalast ha nagyobb mint egy es utana onnan olvasom ki az elso erteket.

De valamiert nem sikerult. Ti ezt hogyan oldanatok meg? Elnezest az ekezetek hianya miatt.
Biztosan egy trivialis dolog az amivel ez megoldhato, de teljesen megakasztott.

Elore is koszonok midnen segitseget!

Udvozlettel,
Tibi
 
1

Korábbi kérdés

Poetro · 2012. Jan. 17. (K), 16.52
Talán egy korábbi kérdés segítséget nyújthat a problémádra.
2

Szia!Koszi a linket!

juhasztibi · 2012. Jan. 17. (K), 19.05
Szia!

Koszi a linket! Hasznos volt, segitett a szemlelt kialakitasaban. Viszont en ennek ellenere abba az iranyba indultam el, hogy fogom es lekerdezem roomid alapjan az osszes foglalast ami adott szobara talalhato.

Mindezt ugy, hogy elso lekerdezesben visszajonnek a szobak majd ezen iteralva meghivok minden iteracioban egy lekerdezest az adott iteracioban talalhato szoba id-val. Ez fogja visszaadni az adott szoba foglalalsait.

Mivel itt visszajon a fromdate es a todate is, ennek megfeleloen adok meg listazasi felteteleket. Azzal nincs is gond, hogy kilistazzam a szobak foglalasanak kezdetet es veget. Azzal van most a gondom, hogy a ketto datum kozotti napokat kezeljem. Ha egy szoba foglalt 5.-tol 10.-ig akkor most latszik a listaban, hogy 5.-en kezdodik es latszik az is, hogy 10.-en van vege, viszont az nem, hogy a ketto kozott is foglalt.
Erre keresek egy megoldast. Ha van oteleted megkoszonnem.


$start_date = $_POST['reserv']['fromDate'];
$check_date = $start_date;
$end_date = $_POST['reserv']['toDate'];
		while ($check_date != $end_date) {
			echo "<strong>".$check_date." szobak: </strong><br />";
			for($i=0;$i<count($rooms_list);$i++){
		
				$roomid =  $rooms_list[$i]->idrooms;
		
				$reservation = reservation::getRoomReserv($roomid);
		
				for($j=0;$j<count($reservation);$j++){
					if($reservation[$j]->fromdate==$check_date){
                        echo $reservation[$j]->idrooms;
					} elseif($reservation[$j]->todate==$check_date){
						echo $reservation[$j]->idrooms;
					}
				}
			}
		
			$check_date = date ("Y-m-d", strtotime ("+1 day", strtotime($check_date)));
		}

	}
}
3

Hideg fejjel kicsit

juhasztibi · 2012. Jan. 19. (Cs), 16.22
Hideg fejjel kicsit pihentetve a dolgot vegigneztem ujra a feladatot. Meglepoen hamar meglett a megoldas. Lam egy ekes pelda a bejegyzesem arra az esetre ha kapkodni kezd az ember... Remelem valami haszna azert van/volt/lesz ennek a bejegyzesnek es nem csak teleszemetelem a forumot. Egy alternativ megoldasnak ez is megteszi (fapados megoldasnak).

$start_date = $_POST['reserv']['fromDate'];
$check_date = $start_date;
$end_date = $_POST['reserv']['toDate'];

		while ($check_date != $end_date) {
			echo "<strong>".$check_date." szabad szobak: </strong><br />";
			$date=array();
			$rooms=array();
			for($i=0;$i<count($rooms_list);$i++){
				
				$flag=0;
				
				$roomid = $rooms_list[$i]->idrooms;
				
				$reservation = reservation::getRoomReserv($roomid);
		
				for($j=0;$j<count($reservation);$j++){
						if($reservation[$j]->fromdate<=$check_date && $reservation[$j]->todate>=$check_date){
							if(!in_array($reservation[$j]->idrooms, $rooms)){
								$rooms[]=$reservation[$j]->idrooms;
								$flag=1;
							}
							$date[]=$reservation[$j]->todate;
						}
				}
				
				if($flag==1){
					echo "<div class='roomreserved'>".$rooms_list[$i]->roomnumber."</div>";
				} else {
					echo "<div class='roomfree'><span id='check'>".$rooms_list[$i]->roomnumber."<span class='data'>/".$check_date."</span></span></div>";
				}
			}

			$check_date = date ("Y-m-d", strtotime ("+1 day", strtotime($check_date)));
			
		}

	}
}

Nem egy egetrengeto problema volt, ahogy a megoldas sem az, de talan gondolatnak jo.

koszi&udv,
Tibi