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

使用PHP和MySQL,我如何创建一个简单的房间可用性检查?,php,mysql,Php,Mysql,什么是检查房间可用性的简单方法 我一直在为班级做一个小项目,只是一个简单、小的酒店注册页面,需要联系信息和账单信息。请记住,未加密的信息在这里不是问题 以下是my process.php页面的一部分: $sql="INSERT INTO UMBRELLA (firstName, lastName, email, arrivalDate, departureDate, adultGuests, childGuests, roomReservation, newsletterBool, comm

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

我一直在为班级做一个小项目,只是一个简单、小的酒店注册页面,需要联系信息和账单信息。请记住,未加密的信息在这里不是问题

以下是my 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。标准套房。基本上,我想创建一个变量$maxRooms,它等于10

$maxRooms=10;
然后,我将使用SELECT语句获取每个特定房间类型的所有有用数据(请注意,这是伪代码,因此可能会禁用某些格式):

然后,我会检查在给定的日期范围内保留了多少房间,如果>=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'";

不重复,但显然您不希望在任何情况下将
$\u POST
值直接传递到数据层。此外,您不应在未接受PCI合规性评估的任何服务器上保存像
CreditCardNumber
这样的字段。我意识到这是课堂上的一个理论应用,但这些东西需要为那些可能会绊倒的人注意

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

我知道您提到要避免联接,但是跨单独存储事务数据和房间可用性的表联接可能会使这更简单。这可能值得考虑

也就是说,如果我正确理解了你的需求,你需要做的就是这样一种查询

//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驱动程序通过
$pass->format('Y-m-dh:i:s')传入日期时间对象的两个值
$now->格式('Y-m-dh:i:s')用于在值之间切换。对其他两种房间类型重复此过程


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

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

因此,当有人单击“预订”或表单上的“提交”按钮时,会进行检查以确保他们选择的房间类型可用。如果不是,他们都被预订了。如果有他们选择的类型的开放式房间,他们会被预订房间(这增加了当前该类型房间的预订数量,使得下一个房间的预订量减少)等等。你必须写一些东西以便退房等等


像这样的?老实说,我没有试过……但这就是你想要的主意吗?我希望它能有所帮助,也许…

不要像那样从原始的$\u POST变量构建SQL。真糟糕。不管它是否是“仅内部的”——总有一天会有人(甚至是偶然的)这样做。你的SQL太开放了,无法注入。请查看PDO或至少
mysql\u real\u escape\u string()
。大家说得好。我真的不确定那部分,所以它只是伪代码。事实上,我以前使用过mysql\u real\u escape\u string(),所以如果我实现了这种方法,我肯定会使用它。如何在数据库中存储日期是一种正确的日期格式或varchar格式。想想孩子们。请使用PDO和参数进行查询。这不是在验证任何东西..您需要这样做。我使用post只是为了便于查看。请验证etc etlsfj;是的,我用了一个下拉框来选择房间。此外,每种类型有10个房间。最后,您是对的——我想输出一条错误消息,如果该类型的房间已满,则不上传任何信息。你说得对,非常感谢。
SELECT COUNT(*) AS rooms FROM UMBRELLA WHERE roomReservation='Standard Suite' AND arrivalDate BETWEEN ? AND ?
    <select>
        <option value="presidential">Presidential Suite</option>
        ....</select>
    $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.";
        }