繁体   English   中英

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

[英]Using PHP and MySQL, how can I create a simple room availability check?

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

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

这是我的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变量到给定的日期范围?

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

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

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

那么,他们会通过选择输入等方式告诉您他们想要哪种类型的房间? 即:

    <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.";
        }

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

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

不要重申,但显然您不希望在任何情况下将$_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('Ymd H:i:s'); $now->format('Ymd H:i:s'); 为你的价值观。 对其他两种房型重复此过程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM