8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je cherche a créer une application de réservations de chambres d'hôtels.
Voici le code actuel qui marche très bien.

Mais, car il y a un mais, j'aimerais que lorsque une chambre est déjà occupée, pour des dates déjà enregistrées elle ne puisse plus être réservée pour ces dates et que la réservation se fasse sur une autre chambre du même hôtel pour ces mêmes dates.
J'aimerais pour cela effectuer un filtrage en fonction des dates, mais après plusieurs essais infructueux je ne sais pas comment procéder pour y arriver.

Tables:
bookings
id | client_id | arrival_date | departure_date | booking_date | room_id

clients
id | name | email

resorts
id | name | address
-------------------
1 | hotel A | adresse A
-------------------
2 | hotel B | adresse B
------------------
3 | hotel C | adresse C
------------------
4 | hotel D | adresse D

rooms
id | resort_id | number
-------------------------
1 | 1 | 1
-------------------------
2 | 1 | 2
-------------------------
3 | 2 | 3
-------------------------
4 | 2 | 4
-------------------------
5 | 3 | 5
-------------------------
6 | 3 | 6
-------------------------
7 | 4 | 7
-------------------------
8 | 4 | 8

index.php

<?php
require('Class/Client.php');
require('Class/Clientmanager.php');

require('Class/Booking.php');
require('Class/Bookingmanager.php');

if (isset($_POST['submitForm'])) 
{
	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           insertion client                          ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	$name = $_POST['name'];
	$email = $_POST['email'];
	$client_data = array('name' => $name,'email' => $email);
	$client = new Client($client_data);
	$db = new PDO('mysql:host=localhost;dbname=booking;charset=UTF8', 'root', '');
	$clientManager = new clientManager($db);
	$client_id = $clientManager->addclient($client);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           get rooms by resort id 			        ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	$arrival = $_POST['arrival'];
	$departure = $_POST['departure'];
	$booking_data = array('client_id' => (int) $client_id);
	$booking = new Booking($booking_data);
	$bookingManager = new bookingManager($db);
	$resort_id = $bookingManager->getRoomsByResortid($booking);
	var_dump($resort_id);

	$addClient = $bookingManager->addBooking($booking);

	

}
?>

<!DOCTYPE html>
<html lang="fr">
<head>
	<meta charset="UTF-8">
	<title>Accueil</title>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
	<div id="wrapper">
		<h1>Booking Application</h1>
		<nav class="main-nav" role="navigation">
			<ul>
				<li><a href="index.php" role="menuitem">Accueil</a></li>
				<li><a href="resorts.php" role="menuitem">Hôtels</a></li>
			</ul>	
		</nav>

		<section>
			<div class="formulaire">
				<?php if(isset($error_msg)) : ?>	
				<p class="error_msg"><?php echo $error_msg ?></p>
				<?php endif ?>

				<?php if(isset($success_msg)) : ?>	
				<p class="success_msg">
					<?php echo $success_msg ?></p>
				<?php endif ?>

				<form method="post" action="index.php">
					<h2>Réservez votre hôtel</h2>
					<p>
						Votre nom: <input type="text" name="name" value="<?php $name ?>" placeholder="Nom">
					</p>

					<p>
						Votre email: <input type="email" name="email" value="<?php $email ?>" placeholder="votre@mail">
					</p>

					<p>
						Votre hôtel:<select name="resort">
										<option value=""></option>
										<?php 
											$resorts = array(1 => 'Atlantis The Palm, Dubaï 5*', 'Burj Al Arab, Dubaï 7*', 'Krabi La Playa, Thaïlande 4*', 'Four Seasons, Bora Bora 4*', 'Atlantis Paradise Island, Bahamas 4*');
											foreach ($resorts as $resort_id => $resort) 
											{
												echo '<option value="'.$resort_id.'">' .$resort. '</option>';
											}

										?>
									</select>
						
					</p>

					<p>
						Du: <input class="mr-30" type="date" name="arrival" value="">
						Au: <input class="mr-30" type="date" name="departure" value="">
					</p>

					<p>
						<?php $today = date("Y-m-d") ?>
						<input type="hidden" name="bookingCreation" value="<?php echo $today ?>" >
					</p>

					<p>
						<input class="submit-bt" type="submit" name="submitForm" value="Réserver">
					</p>
					
					
				</form>
			</div>
		</section>
	</div>
</body>
</html>


Client.php

<?php

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                                                                           ///////////////////////
///////////////                             CLIENT                                        ///////////////////////
///////////////                                                                           ///////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class Client
{
	private $_name;
	private $email;

	public function __construct(array  $client_data)
	{
		$this->setName($client_data['name']);
		$this->setEmail($client_data['email']);
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           setters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function setName($name)
	{
		$this->_name = $name;
	}

	public function setEmail($email)
	{
		$this->_email = $email;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           getters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function getName()
	{
		return $this->_name;
	}

	public function getEmail()
	{
		return $this->_email;
	}
}
?>


Clientmanager.php

<?php

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                                                                           ///////////////////////
///////////////                           CLIENT MANAGER                                  ///////////////////////
///////////////                                                                           ///////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Class clientManager
{
	private $_db;

	public function __construct($db)
	{
		$this->setDb($db);
	}

	public function setDb(PDO $dbh)
	{
		$this->_db = $dbh;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           insertion client                          ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function addClient(Client $client)
	{
		$sql = 'INSERT INTO clients (name, email) VALUES (:name, :email)';
		$stmnt = $this->_db->prepare($sql);
		$name = trim($client->getName());
		$email = trim($client->getEmail());
		$stmnt->bindParam(':name', $name);
		$stmnt->bindParam(':email', $email);
		if ($stmnt->execute()) 
		{
			return $this->_db->lastInsertId();
		}
		return false;

		//gestion des erreurs
		$errors = $stmnt->errorInfo();
		if ($errors[0] != '00000') 
		{
			echo 'Erreur SQl ' . $errors[2];
		}
		else
		{
			$success_msg = 'Le nom ' .$name. ' et l\'email ' .$email. ' ont bien été enregistrés en base de données';
		}
	}
}
?>


Booking.php

<?php

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                                                                           ///////////////////////
///////////////                               BOOKING                                     ///////////////////////
///////////////                                                                           ///////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class Booking
{
	private $_client_id;
	private $_arrival_date;
	private $_departure_date;
	private $_today;
	private $_room_id;

	public function __construct(array $booking_data)
	{
		$this->setClientId($booking_data['client_id']);
		$this->setArrivalDate();
		$this->setDepartureDate();
		$this->setToday();
		$this->setRoomId();

	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           setters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function setClientId($client_id)
	{
		if ((is_int($client_id)) && $client_id > 0) 
		{
			$this->_client_id = $client_id;
		}
	}

	public function setArrivalDate()
	{
		$arrival = $_POST['arrival'];
		$this->_arrival_date = $arrival;
	}

	public function setDepartureDate()
	{
		$departure = $_POST['departure'];
		$this->_departure_date = $departure;
	}

	public function setToday()
	{
		$today = date("Y-m-d"); 
		$this->_today = $today;
	}

	public function setRoomId()
	{
		try
		{
			$dbh = new PDO('mysql:host=localhost;dbname=booking;charset=UTF8', 'root', '');
		}
		catch(Exception $e)
		{
			echo 'Message d\'erreur SQL ' .$e->getMessage(). '<br>';
			exit;
		}


		$resort_id = trim($_POST['resort']);
		$sql= 'SELECT number FROM rooms as o 
			   INNER JOIN resorts as r 
			   ON r.id = o.resort_id
			   WHERE r.id = "'.$resort_id.'"';
		$stmnt = $dbh->prepare($sql);
		$stmnt->execute();
		$result = $stmnt->fetchAll();
		$room_id = $result[(array_rand($result))]['number'];
		$this->_room_id = $room_id;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           getters                                   ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function getClientId()
	{
		return $this->_client_id;
	}

	public function getArrivalDate()
	{
		return $this->_arrival_date;
	}

	public function getDepartureDate()
	{
		return $this->_departure_date;
	}

	public function getToday()
	{
		return $this->_today;
	}

	public function getRoomId()
	{
		return $this->_room_id;
	}
}
?>


Bookingmanager.php

<?php

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                                                                           ///////////////////////
///////////////                             BOOKING MANAGER                               ///////////////////////
///////////////                                                                           ///////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class bookingManager
{
	private $_db;

	public function __construct($db)
	{
		$this->setDb($db);
	}

	public function setDb(PDO $dbh)
	{
		$this->_db = $dbh;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           Obtenir la liste des chambres 			////////////////
	///////////////                                 pour un hôtel                       ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function getRoomsByResortid($resort_id)
	{
		$resort_id = $_POST['resort'];
		$sql = 'SELECT number, arrival_date, departure_date, room_id FROM rooms as o
				LEFT JOIN bookings as b on b.room_id = o.id
				INNER JOIN resorts as r on r.id = o.resort_id
				WHERE r.id = "'.$resort_id.'"';
		$stmnt = $this->_db->prepare($sql);
		$stmnt->execute();
		while ($row = $stmnt->fetch(PDO::FETCH_ASSOC)) 
		{
			$result[] = $row;
		}
		return $result;
		
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////                           ajouter un client                         ////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public function addBooking(Booking $booking)
	{
		$arrival = $_POST['arrival'];
		$sql = 'INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id)
				VALUES (:client_id, :arrival, :departure, :today, :room_id)';
		$stmnt = $this->_db->prepare($sql);
		$clientId = $booking->getClientId();
		$arrival = $booking->getArrivalDate();
		$departure = $booking-> getDepartureDate();
		$today = $booking->getToday();
		$roomId = $booking->getRoomId();
		$stmnt->bindParam('client_id', $clientId);
		$stmnt->bindParam('arrival', $arrival);
		$stmnt->bindParam('departure', $departure);
		$stmnt->bindParam('today', $today);
		$stmnt->bindParam('room_id', $roomId);
		$stmnt->execute();

		//gestion des erreurs
		$errors = $stmnt->errorInfo();
		if ($errors[0] != '00000') 
		{
			echo 'Erreur SQL ' . $errors[2];
		}
		else
		{
			$success_msg = 'Les données ont bien été enregistrées en base de données';
		}
	}
}
?>


D'avance merci à ceux qui prendront le temps de m'aider
Modérateur
Et l'eau,

J'avoue ne pas vraiment avoir lu ton code. Mais, car il y a un mais Smiley lol

tu ajoutes un champ dans ta table rooms :

ALTER TABLE rooms
ADD COLUMN rented TINYINT default 0;


<<<EDIT
je pense que tu auras besoin de connaître ceci : cron
EDIT;
Modifié par niuxe (24 Jul 2019 - 08:50)
Salut Niuxe,

Merci pour ta réponse.
Si je comprends bien la colone rented va rendre la chambre indisponible si la valeur par défaut n'est plus 0 mais 1 par exemple.
Ceci dès qu'une date d'entrée et une date de sortie seront ajoutées

Or ce n'est pas ce que je cherche à faire, je veux la rendre rentre indisponible pour les créneaux qui auront été réservés uniquement.
Ex:
Hotel A
room 1
room2

Un 1er client arrive et veux un chambre dans l'hôtel A du 2020-01-01 au 2020-01-05
Donc on aura:
----------------------------------
room 1
----------------------------------
arrival_date | departure_date
2020-01-01 | 2020-01-05


----------------------------------
room 2
----------------------------------
arrival_date | departure_date
NULL | NULL


Un 2eme client arrive et veux un chambre dans l'hôtel A du 2020-01-01 au 2020-01-05
Donc on aura :

----------------------------------
room 1
----------------------------------
arrival_date | departure_date
2020-01-01 | 2020-01-05

----------------------------------
room 2
----------------------------------
arrival_date | departure_date
2020-01-01 | 2020-01-05


Un 3eme client arrive et veux un chambre dans l'hôtel A du 2020-01-12 au 2020-01-17
Donc on aura :

----------------------------------
room 1
----------------------------------
arrival_date | departure_date
2020-01-01 | 2020-01-05

----------------------------------
room 1
----------------------------------
arrival_date | departure_date
2020-01-12 | 2020-01-17


----------------------------------
room 2
----------------------------------
arrival_date | departure_date
2020-01-01 | 2020-01-05

Cron est quelque chose qui fonctionne sous Linux non ?
Je suis sous Windows Smiley lol
Modifié par Gan3sh (24 Jul 2019 - 16:42)
Salut salut....

je vais essayé d'apporter un regard extérieur sur "la logique" et non l'aspect technique.

Il faut
Lorsque je saisie une réservation qu'il y est en premier lieu une recherche sur la chambre en question avec le créneaux de date.

// SELECT * FROM hotel WHERE date_debut = 'dd/mm/YY' AND date_retour = 'dd/mm/YY'

Si mon hotel apparaît dans le résultat ALORS la réservation n'est pas possible
SINON je réserve.

Il ne devrait normalement pas avoir de problème avec un algo simple comme celui ci.
Salut Jencal

Merci pour ta réponse.
C'est sans doute simple mais je n'y arrive pas je pense ne plus être très loin mais je bloque.
Voici les requêtes que j'avais essayé sans succès avant de poster:


Sur getRoomsByResortId($resort_id)
---------------------------------------------------------------------------------------------
Entraînent Undefined variable: result in C:\wamp64\www\PHP04-refund\class\Bookingmanager.php
---------------------------------------------------------------------------------------------
$arrival = $_POST['arrival']
$departure = $_POST['departure']

AND arrival_date < "'.$arrival_date.'" AND departure_date >= "'.$departure_date.'"
AND arrival_date != "'.$arrival_date.'" AND departure_date != "'.$departure_date.'"
AND arrival_date AND departure_date NOT BETWEEN "'.$arrival_date.'" AND "'.$departure_date.'"


-------------------------------
Requêtes qui fonctionnent en sql mais qui posent problème en php
-------------------------------

SELECT number, arrival_date, departure_date FROM rooms AS o 
LEFT JOIN bookings as b ON b.room_id=o.id 
INNER JOIN resorts AS r ON r.id=o.resort_id 
WHERE r.id= 1 AND arrival_date != '2020-01-01' AND departure_date != '2020-01-05' 
ORDER BY number ASC
(les dates étant remplacées par $arrival et $departure en php)


SELECT number, arrival_date, departure_date FROM rooms AS o 
LEFT JOIN bookings as b ON b.room_id=o.id 
INNER JOIN resorts AS r ON r.id=o.resort_id 
WHERE r.id= 1 AND arrival_date AND departure_date NOT BETWEEN '2020-01-01' AND '2020-01-05' 
ORDER BY number ASC


-------------------------------
Requête qui renvoie des données vides sans message d'erreur
-------------------------------
SELECT number, arrival_date, departure_date FROM rooms AS o 
LEFT JOIN bookings as b ON b.room_id=o.id 
INNER JOIN resorts AS r ON r.id=o.resort_id 
WHERE r.id= 1 AND arrival_date < '2020-01-01' AND departure_date >= '2020-01-05' 
ORDER BY number ASC



sur addbooking
-------------------------------
Requête qui renvoie une Erreur SQL
-------------------------------
$arrival = $_POST['arrival']
ON DUPLICATE KEY UPDATE arrival_date < "'.$arrival.'"

Modifié par Gan3sh (24 Jul 2019 - 16:53)
Modérateur
Gan3sh a écrit :

Cron est quelque chose qui fonctionne sous Linux non ?

non sur Unix et Unix like

Gan3sh a écrit :
Je suis sous Windows Smiley lol


Alors bonne chance....

Comment peux tu stocker l'information si chambre X de l'hôtel Y est réservée ?
Comment peux tu enlever la réservation (de la chambre X de l'hôtel Y) lorsque le client Z est parti ? Tu peux contre-carré cela, mais tu te tapes une saisie qui parfois ne sera pas faite....

<<<EDIT
liens annexes :
raspberry pi
lamp avec raspberry pi
EDIT;
Modifié par niuxe (24 Jul 2019 - 18:19)
niuxe a écrit :

Comment peux tu stocker l'information si chambre X de l'hôtel Y est réservée ?
Comment peux tu enlever la réservation (de la chambre X de l'hôtel Y) lorsque le client Z est parti ?


On ne m'a demandé que la partie dont je t'ai parlé il s'agit d'un exercice