PHP:如何防止两台计算机同时被预订?

PHP:如何防止两台计算机同时被预订?,php,mysql,sql,Php,Mysql,Sql,几周前我开始学习PHP,我很高兴地说,我已经制作了一个工作的计算机预订系统,我发现开发一个项目可以帮助我学得最好,所以我就是这么做的 注册/登录以及删除帐户/更改密码等功能都非常有效,您可以预订电脑。然而,我不知道如何做到当一台特定的计算机被预订时,比如说PC-1,另一个用户无法再次前来预订,我显然需要某种IF语句,但我不确定如何做到。当用户预订PC-1时,计算机不能再被预订,并且回复时会出现错误,告知用户选择其他计算机。我可以实现一个队列系统,但这可能有点太高级了 非常感谢您的帮助,如果我把格

几周前我开始学习PHP,我很高兴地说,我已经制作了一个工作的计算机预订系统,我发现开发一个项目可以帮助我学得最好,所以我就是这么做的

注册/登录以及删除帐户/更改密码等功能都非常有效,您可以预订电脑。然而,我不知道如何做到当一台特定的计算机被预订时,比如说PC-1,另一个用户无法再次前来预订,我显然需要某种IF语句,但我不确定如何做到。当用户预订PC-1时,计算机不能再被预订,并且回复时会出现错误,告知用户选择其他计算机。我可以实现一个队列系统,但这可能有点太高级了

非常感谢您的帮助,如果我把格式弄错了,我深表歉意

我将在下面发布代码,干杯

<?php

    include 'header.php';
    include 'db.php';
?>

    <?php

        if (isset($_SESSION['studentId'])) {
            echo "<h3>Hello, <h3>".$_SESSION['studentId'];
        //echo "<br><br>It is currently " . date("l jS \of F Y h:i:s A");
        } else {
            echo "You are not logged in";
        }
    ?>

    <form name="book" method="GET" action="booking.php">

    <h4>Select a Computer: </h4>

    <select name="computerId"> <br>

            <?php 

                for($i=1; $i<=100; $i++)
                {

                    echo "<option name=computerId value=".$i.">PC-".$i."                
</option>";
            }
                echo "<br></br>"
            ?>

    </select>

    <h4>Select a Date: </h4>
    <input type="date" name="arrivalDate">

    <?php

        $arrivalDate = $_GET['arrivalDate'];
        $date = date('Y-m-d')
    //If ($arrivalDate = $date) {

        //  echo "Error, booking date must be in the future!";

    //  } elseif ($arrivalDate < $date) {

    //      echo "Error, booking date cannot be in the past!";

        //}

    ?>

     <h4>Select a Time: </h4>
    <input type="time" name="arrivalTime">

    <h4>What time will you finish?</h4>
    <input type="time" name="departureTime">

    <?php
            $arrivalTime = $_GET['arrivalTime'];
            $departureTime = $_GET['departureTime'];

    if ($arrivalTime = $departureTime) {

        //echo 'Error, you cannot book a computer at the same time you 
 finish with it.';

    } elseif ($arrivalTime > $departureTime) {

        echo 'Error, you cannot book a computer for a time in the past';

    }

    ?>

    <br> <br><input type="submit" name="submit" onclick="alert('Successful 
 Booking!')" value="Book">
   </form>



<?php

if(isset($_GET['submit']))
{
    $computerId = $_GET['computerId'];
    $studentId = $_SESSION['studentId'];
    $arrivalDate = $_GET['arrivalDate'];
    $arrivalTime = $_GET['arrivalTime'];
    $departureTime = $_GET['departureTime'];
    $bookingId = $studentId.'-'.$computerId;

    if($_GET['computerId'] = $_SESSION['computerId']) {

    echo 'You cannot book a computer that is already booked!';

}

    $sql = "INSERT INTO Booking (bookingDate, bookingId, studentId, 
   computerId, arrivalDate, arrivalTime, departureTime) values (CURDATE(), 
  '$bookingId', '$studentId', '$computerId', '$arrivalDate', '$arrivalTime', 
  '$departureTime')";

    if ($conn->query($sql)=== TRUE) {
        echo "<br>".$computer."";
    } else {
       // echo "Error: " . $sql . "<br>" . $conn->error;
    }

    $sql1 = "SELECT FROM Booking '$computerId', '$arrivalDate', 
   '$arrivalTime', '$departureTime'";

    echo ' <br> You have booked computer '.$computerId.' for 
   '.$arrivalDate.' at '.$arrivalTime.' until '.$departureTime;

    $conn->close();
    }

    //$sql = "SELECT computerId FROM Booking WHERE studentId = 
    '$_SESSION['studentId']"

    //echo "hi";

   ?>

 </body>
 </html>

选择一台计算机:

选择一个日期: 选择一个时间: 你什么时候结束?


你好,我很高兴帮助你:) 你犯了个错误

if($_GET['computerId'] = $_SESSION['computerId']) {
   echo 'You cannot book a computer that is already booked!';
}
你觉得这次会议怎么样。它为同一台计算机生成您访问的内容,而不是为服务器生成的内容。您只需要从数据库中进行验证。并返回此消息。 当某本书出版时,您需要将所有信息存储在数据库中。当来自其他计算机的其他人进行预订时,请从数据库中验证并显示此消息。因为会话帮不了你


我希望您能理解这一点。

您应该在代码中执行此操作,在代码中检索将计算机表连接到预订表的计算机,如下所示:

$now = time();//assuming you store time as Unix timestamp
$query = "SELECT * from computers 
WHERE  computers.id NOT IN 
(SELECT c.id from computers c LEFT JOIN 
bookings b ON c.id = b.computerId 
WHERE b.departureTime >  ".$now.")";

有了
唯一的
数据库约束,就不会发生这种情况。如果您有一个带有预订槽和计算机的表作为约束,那么两个人不可能插入具有相同值的记录。第二个人将得到一个您可以处理的错误,显示为“已预订”。还有,为什么这个标签是HTML和CSS?这些似乎与您的预订问题完全无关。警告:当使用
mysqli
时,您应该使用并将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
$\u POST
$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。注意:请尝试改掉在一次性使用的变量中声明SQL语句的习惯。如果查询直接提供给函数,那么遵循代码就容易多了,而且不再有可能弄乱并发送
$sql3
而不是视觉上相似的
$sql8
。请尝试摆脱用不必要的东西(如
==true
)来混乱代码的习惯。许多函数被设计为返回逻辑上为真或假的值,因此这是多余的。