Réservation chambre d'hôtels

a marqué ce sujet comme résolu.

Bonjour, un client doit réserver une chambre d’hôtel entre telle et telle date tout en lui confirment si la chambre est libre ou occupée.

J’ai structuré les tables de cette façon, mais je sais pas si c’est juste.

Besoin d’aide, merci d’avance.

Bonjour heu…, je n’arrive pas a comprendre comment tu peux dire si la chambre est libre ou occupé si il n’y a pas de date de reservation (genre date_debut et date_fin) de ce que je vois tu ne prevois d’avoir que un seul hotel, avec un numero unique par chambre mais c’est quoi "name address …" dans la table réservation, c’est les clients ? (c’est peut être un details, mais le nom de la table est confus) la table hotel chambre sert a quoi ? elle serait la car tu as plusieurs hotel ?

juste concernant l’organisation des tables j’ignore ton CDC mais tu peux faire

  • hotel : liste tout les hotels que tu veux gerer (avec leurs infos)
  • chambre: liste toutes les chambres avec l’id de l’hotel correspondant (et leurs infos propre)
  • client: toutes les infos du client
  • réservation : table avec la chambre, le client et les dates d’arrivée et de départ

car la ta table "hotel_chambre" ne me semble pas utile, car n’apporte rien, tu fais many to many mais si demain un hotel te dit "j’aimerais rajouté des details dans la chambre X" tu devras le rajouter dans cette table, et donc devoir faire une jointure, juste pour recuperer les infos du chambre

PS: je comprends pas ce que t’as voulu faire avec "client" et "reservation" separé

PPS : je t’ai donné une piste faite en 40 secondes, je te conseil de te posé de faire un modèle de données genre <https://dbschema.com/download.html> je connais pas il a l’air gratuit et de faire le taf

C’est mieux de mettre les morceaux en SQL (et qu’importe le langage en fait) sous forme de texte et non d’images pour que l’on puisse copier-coller puis modifier si besoin. Même concernant la structure des tables, l’expliquer à l’aide d’une liste ou d’un tableau aurait été plus clair pour nous.

Concernant

PPS : je t’ai donné une piste faite en 40 secondes, je te conseil de te posé de faire un modèle de données genre <https://dbschema.com/download.html> je connais pas il a l’air gratuit et de faire le taf

depfryer

Il y a StarUML ou draw.io sinon.

PS: je comprends pas ce que t’as voulu faire avec "client" et "reservation" separé

depfryer

Je ne comprends pas quel est la différence entre reservation et reservation_chambre ni pourquou reservation ne fait pas parti de client. C’est bien de ça dont tu parlais ? C’est peut être les coordonnées de facturation.

Bonjour, j’ai crée ma table hotel avec toutes les informations concernant l’hôtel.

Je voudrais les afficher sur la page mais ce message d’erreur ->

Erreur fatale: erreur non détectée: appel à une fonction membre getName () sur le tableau dans C: \ wamp64 \ www \ hotels_clients \ hotel.php sur la ligne 21

class/hotelManager.php


<?php 

class hotelManager {

    private $_db;

    public function __construct(PDO $db) {

        $this->setDb($db);
    }

    public function setDb($dbh) {

        $this->_db = $dbh;
    }

    public function getHotels() {

        $sql = 'SELECT name, address, postal_code, city, phone FROM hotel';

        $stmnt = $this->_db->prepare($sql);

        $stmnt->execute();

        while($hotel_data = $stmnt->fetch()) {

            $hotels_data[] = $hotel_data;
        }

        return $hotels_data;
    }
}

hotel.php


<?php

require('includes/inc_connexion.php');
require('class/Hotel.php');
require('class/hotelManager.php');
require('includes/inc_header.php');

$manager = new hotelManager($db);
$hotels_data = $manager->getHotels();

?>

<div id="container">
    <header>
        <h1>Liste des hôtels par région</h1>
    </header>

    <section>
        <article>
                <h2><?php echo $hotels_data->getName(); ?></h2>
                <p><?php echo $hotels_data->getAddress(); ?></p>
        </article>
    </section>
</div>

<?php require('../includes/inc_footer.php'); ?>

class/Hotel.php


<?php

class Hotel {

    protected $id;
    protected $name;
    protected $address;
    protected $postal_code;
    protected $city;
    protected $phone;

    protected static $error;

    const MSG_ERROR_ID = 'ID doit être un entier.';
    const MSG_ERROR_NAME = 'NOM doit être une chaîne de caractères.';
    const MSG_ERROR_ADDRESS = 'ADRESSE doit être une chaîne de caractères.';
    const MSG_ERROR_POSTAL_CODE = 'CODE POSTAL doit être une chaîne de caractères.';
    const MSG_ERROR_CITY = 'VILLE doit être une chaîne de caractères.';
    const MSG_ERROR_PHONE = 'TELEPHONE doit être une chaîne de caractères.';
    const MSG_ERROR_OBJET = 'L\'objet ne peut pas être crée.';

    public function __construct(array $data) {

        $this->setId($data['id']);
        $this->setName($data['name']);
        $this->setAddress($data['address']);
        $this->setPostalCode($data['postal_code']);
        $this->setCity($data['city']);
        $this->setPhone($data['phone']);
       
        if(!empty(self::$error)) {

            throw new Exception(self::$error . self::MSG_ERROR_OBJET);
        }
    }

    public function setError($msg) {

        self::$error = $msg;
    }

    public function getError() {

        return self::$error;
    }

    public function setId($id) {

        if((is_int($id)) AND ($id > 0)) {

            $this->id = $id;
        }
        else {

            $this->setError(self::MSG_ERROR_ID);
        }
    }

    public function setName($name) {

        if(is_string($name)) {

            $this->name = $name;
        }
        else {

            $this->setError(self::MSG_ERROR_NAME);
        }
    }

    public function setAddress($address) {

        if(is_string($address)) {

            $this->address = $address;
        }
        else {

            $this->setError(self::MSG_ERROR_ADDRESS);
        }
    }

    public function setPostalCode($postal_code) {

        if(is_string($postal_code)) {

            $this->postal_code = $postal_code;
        }
        else {

            $this->setError(self::MSG_ERROR_ADDRESS);
        }
    }

    public function setCity($city) {

        if(is_string($city)) {

            $this->city = $city;
        }
        else {

            $this->setError(self::MSG_ERROR_ADDRESS);
        }
    }

    public function setPhone($phone) {

        if(is_string($phone)) {

            $this->phone = $phone;
        }
        else {

            $this->setError(self::MSG_ERROR_ADDRESS);
        }
    }

    public function getId() {

        return $this->id;
    }

    public function getName() {

        return $this->name;
    }

    public function getAddress() {

        return $this->address;
    }

    public function getPostalCode() {

        return $this->postal_code;
    }

    public function getCity() {

        return $this->city;
    }

    public function getPhone() {

        return $this->phone;
    }
}

+0 -0

Bonjour si je comprends bien une tables associatives c’est pour des cas comme ca :

tu as une table produit, et une table client
un client peut acheter plusieurs produit
plusieurs clients peuvent acheter le même produit

mais il faut pas une table pour mettre une table, la il y a besoin d’une table car c’est une liaison "many to many" et tu peux en profiter pour enrichir la liaison, date d’achat, si ya eu un retour, ect

pour ton autre problème, j’ai traversé en diagonal, je te conseil de reunir le getter et le setter d’une même variable, ca permet d’avoir toutes les infos au même endroit genre getVAR1{} SetVAR1{}

getVAR2{} SetVAR2{} ect (edit je viens de voir que c’était fait a moitié) fais de var_dump… des débogages des echos(’coucou' + variable) pour savoir

cordialement

Bonjour à tous, j’ai avancé dans mon projet mais j’ai des messages d’erreurs.

Remarque: Variable indéfinie: numéro_chambre dans C: \ wamp64 \ www \ hotels_clients \ process \ process_booking.php sur la ligne 38

Erreur fatale: exception PDO non détectée: SQLSTATE [42S22]: colonne non trouvée: 1054 Champ '$ Arrivaldate_form' inconnu dans on clause dans C: \ wamp64 \ www \ hotels_clients \ class \ bookingManager.php sur la ligne 68

PDOException: SQLSTATE [42S22]: Colonne introuvable: 1054 Champ '$ Arrivaldate_form' inconnu dans on clause dans C: \ wamp64 \ www \ hotels_clients \ class \ bookingManager.php sur la ligne 68

MariaDB [hotels]> DESCRIBE booking;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| room_number    | varchar(255) | NO   |     | NULL    |                |
| customer_id    | int(11)      | NO   |     | NULL    |                |
| customer_name  | varchar(255) | NO   |     | NULL    |                |
| hotel_name     | varchar(255) | NO   |     | NULL    |                |
| booking_date   | date         | NO   |     | NULL    |                |
| arrival_date   | date         | NO   |     | NULL    |                |
| departure_date | date         | NO   |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
8 rows in set (0.027 sec)

MariaDB [hotels]> DESCRIBE customer;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| email | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.025 sec)

MariaDB [hotels]> DESCRIBE hotel;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | NO   |     | NULL    |                |
| address     | varchar(255) | NO   |     | NULL    |                |
| postal_code | varchar(5)   | NO   |     | NULL    |                |
| city        | varchar(255) | NO   |     | NULL    |                |
| phone       | varchar(14)  | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
6 rows in set (0.025 sec)

MariaDB [hotels]> DESCRIBE room;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.029 sec)

MariaDB [hotels]> NOTEE;

class bookingManager {

    private $_db;

    public function __construct(PDO $db) {

        $this->setDb($db);
    }

    public function setDb($dbh) {

        $this->_db = $dbh;
    }

    public function addBooking(Booking $booking) {

        $sql = 'INSERT INTO booking (room_number, customer_id, customer_name, hotel_name, booking_date, arrival_date, departure_date)

        VALUES(:room_number, :customer_id, :customer_name, :hotel_name, :booking_date, :arrival_date, :departure_date)';

        $room_number = htmlspecialchars($booking->getRoomNumber());
        $customer_id = $booking->getCustomerId();
        $customer_name = htmlspecialchars($booking->getCustomerName());
        $hotel_name = htmlspecialchars($booking->getHotelName());
        $booking_date = $booking->getBookingDate();
        $arrival_date = $booking->getArrivalDate();
        $departure_date = $booking->getDepartureDate();

        $stmnt = $this->_db->prepare($sql);

        $stmnt->bindParam(':room_number', $room_number);
        $stmnt->bindParam(':customer_id', $customer_id);
        $stmnt->bindParam(':customer_name', $customer_name);
        $stmnt->bindParam(':hotel_name', $hotel_name);
        $stmnt->bindParam(':booking_date', $booking_date);
        $stmnt->bindParam(':arrival_date', $arrival_date);
        $stmnt->bindParam(':departure_date', $departure_date);

        if($stmnt->execute()) {

            return true;
        }
        else {

            return false;
        }
    }

    public function getRoom($room_number) {

        $sql = 'SELECT RO.id FROM room AS RO
                LEFT JOIN booking AS BO
                ON (RO.id = BO.room_number
                AND ($arrivaldate_form BETWEEN BO.arrival_date AND BO.departure_date
                OR $departuredate_form BETWEEN BO.arrival_date AND BO.departure_date
                OR BO.arrival_date BETWEEN $arrivaldate_form AND $departuredate_form
                OR BO.departure_date BETWEEN $arrivaldate_form AND $departuredate_form))

                WHERE BO.room_number IS NULL
        ';

        $stmnt = $this->_db->prepare($sql);

        $stmnt->bindParam(':room_number', $room_number);

        $stmnt->execute();

        $count = $stmnt->rowCount();

        return $count;
    }
}
require('../includes/inc_connexion.php');
require('../class/Booking.php');
require('../class/bookingManager.php');

if(isset($_POST['submit_form'])) {

    if((empty($_POST['username_form'])) OR (!isset($_POST['hotelname_form']))

        AND (!isset($_POST['bookingdate_form'])) AND (!isset($_POST['arrivaldate_form'])) AND (!isset($_POST['departuredate_form']))) {

        $message = '<p class="error">Tous les champs doivent être remplis !</p>';
    }
    else {

        $username_form = trim($_POST['username_form']);
        $hotelname_form = trim($_POST['hotelname_form']);
        $bookingdate_form = trim($_POST['bookingdate_form']);
        $arrivaldate_form = trim($_POST['arrivaldate_form']);
        $departuredate_form = trim($_POST['departuredate_form']);


        $booking_data = array(

            'id' => 1,
            'customer_name' => $username_form,
            'hotel_name' => $hotelname_form,
            'booking_date' => $bookingdate_form,
            'arrival_date' => $arrivaldate_form,
            'departure_date' => $departuredate_form
        );

        $booking = new Breve($booking_data);

        $manager = new bookingManager($db);

        if(!$manager->getRoom($room_number)) {

            $message = '<p class="error">Pas de chambre entre cette date</p>';
        }
        else {

            $booking = $manager->addBooking($booking);

            var_dump($booking);
        }
    }
}

Merci d’avance pour votre aide.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte