使用PHP和MySQL,如何创建简单的房间可用性检查?

时间:2011-12-02 16:02:00

标签: php mysql

检查房间可用性的简单方法是什么?

我一直在为一个小课程上课,只是一个简单的小型酒店注册页面,需要联系信息和账单信息。请记住,未加密的信息不是问题。

以下是我的process.php页面的一部分:

$sql="INSERT INTO UMBRELLA (firstName, lastName, email, arrivalDate, 
departureDate, adultGuests, childGuests, roomReservation, newsletterBool, 
comments, creditCardType, creditCardNumber, expirationMonth, expirationYear, 
securityCode, phone)
VALUES
('$_POST[firstName]','$_POST[lastName]','$_POST[email]', '$_POST[arrivalDate]', 
'$_POST[departureDate]', '$_POST[adultGuests]', '$_POST[childGuests]', 
'$_POST[roomReservation]', '$_POST[newsletterBool]', '$_POST[comments]',
'$_POST[creditCardType]', '$_POST[creditCardNumber]', '$_POST[expirationMonth]', 
'$_POST[expirationYear]', '$_POST[securityCode]', '$_POST[phone]')";

我更希望保持解决方案简单,因为它只是一个小要求,所以我不想为多对多关系创建额外的表(例如ROOMS表,BOOKINGS表) )。 roomReservation值只有三个选项:1。总统套房2.主套房3.标准套房。基本上,我想创建一个等于10的变量$ maxRooms。

$maxRooms=10;

然后我会使用SELECT语句来获取每个特定房间类型的所有有用数据(注意这是伪代码,因此某些格式可能会关闭):

$standard = "SELECT arrivalDate, departureDate, roomReservation FROM UMBRELLA 
WHERE roomReservation = 'Standard Suite';"

$master = "SELECT arrivalDate, departureDate, roomReservation FROM UMBRELLA 
WHERE roomReservation = 'Master Suite';"

$presidential = "SELECT arrivalDate, departureDate, roomReservation FROM 
UMBRELLA WHERE roomReservation = 'Presidential Suite';"

然后我会检查在给定日期范围内预订了多少房间,如果它是> = maxRooms,那么该页面将输出错误。这是我遇到麻烦的部分。我将不胜感激任何帮助或见解!谢谢!

tl; dr我需要用什么代码来比较$ standard,$ master和$ presidential变量到给定的日期范围?

3 个答案:

答案 0 :(得分:1)

让我们以标准套装查询为例,你可以对其余两个使用相同的想法。

要查找给定日期范围内存在多少预留,此查询应该可以解决问题:

$reservations = "SELECT count(*) as count FROM UMBRELLA 
WHERE roomReservation = 'Standard Suite' AND arrivalDate BETWEEN '2011-11-20' AND '2011-11-30'";

答案 1 :(得分:1)

那么,他们会告诉你他们想通过选择输入这样的房间类型? 即:

    <select>
        <option value="presidential">Presidential Suite</option>
        ....</select>

最大房间:这是指10间主人套房,10间标准套房和10间总统套房,共计30间客房吗?如果没有,整个'酒店'只有10个房间,这三种类型的分布情况如何?此外,我假设如果房间已满,您不希望数据库上传新预订。

    $maxRooms = 10;
    $fetchQuery = "SELECT room_reservation FROM UMBRELLA 
              WHERE room_reservation = '$_POST[roomReservation]'";
    $fetchResult = mysql_query($fetchQuery);
    $numberRooms = mysql_num_rows($fetchResult);
        if($numberRooms >= $maxRooms)
        {
            echo "error: All ".$_POST['roomReservation'."s are currently booked.";
        }
        else
        {
            $insertQuery = "INSERT into UMBRELLA VALUES('$_POST[firstname]',.....)";
            mysql_query($insertQuery) or die(mysql_error());                        
            echo "Registration Complete.";
        }

因此,当有人点击“预订”或表单上的任何提交按钮时,会检查以确保他们选择的房间类型可用。如果不是,那么他们都被预订了。如果有他们选择的类型的开放式房间,他们被保留在房间(这增加了当前保留的类型的房间数量,使其少于下一个)等等。你必须写一些东西用于检查等明显。

这样的东西?老实说,我没有尝试过等等......但这是你想要的想法吗?我希望它有点帮助...

答案 2 :(得分:0)

不要重复,但显然您不希望在任何情况下将$_POST值直接传递到数据层。此外,您永远不应该在未经过PCI合规性评估的任何服务器上保存CreditCardNumber等字段。我意识到这是课堂的理论应用,但对于那些可能偶然发现的人来说,需要注意这些事情。

也就是说,用于条件比较的对象是PHP5中的DateTime对象,它使用date函数套件在PHP4中表示。

我意识到你提到要避免加入,但是分别存储交易数据和房间可用性的表可能会使这更加简单。值得考虑。

所以说,如果我正确理解你的需要,这就是你需要做的那种查询。

//We need to find the no more than ten rooms have been reserved in a given date range, let's //say for argument sake, 10 days.

$now = DateTime();
$inc = DateInterval::createFromDateString('-10 days');
$past = $now->add($inc);

这将设置从现在起过去十天的日期存储对象。因此,您的查询将被调整为查找计数,而且仅在特定日期范围内。

SELECT COUNT(*) AS rooms FROM UMBRELLA WHERE roomReservation='Standard Suite' AND arrivalDate BETWEEN ? AND ?

然后,您可以使用sql驱动程序传递日期时间对象的两个值,使用$past->format('Y-m-d H:i:s');$now->format('Y-m-d H:i:s');作为值。对其他两种房型重复此过程。

然后,您可以根据最大房间有条件地检查这三个计数的值,并根据需要调整应用程序的行为。