PHP:如何防止两台计算机同时被预订?
几周前我开始学习PHP,我很高兴地说,我已经制作了一个工作的计算机预订系统,我发现开发一个项目可以帮助我学得最好,所以我就是这么做的 注册/登录以及删除帐户/更改密码等功能都非常有效,您可以预订电脑。然而,我不知道如何做到当一台特定的计算机被预订时,比如说PC-1,另一个用户无法再次前来预订,我显然需要某种IF语句,但我不确定如何做到。当用户预订PC-1时,计算机不能再被预订,并且回复时会出现错误,告知用户选择其他计算机。我可以实现一个队列系统,但这可能有点太高级了 非常感谢您的帮助,如果我把格式弄错了,我深表歉意 我将在下面发布代码,干杯PHP:如何防止两台计算机同时被预订?,php,mysql,sql,Php,Mysql,Sql,几周前我开始学习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
)来混乱代码的习惯。许多函数被设计为返回逻辑上为真或假的值,因此这是多余的。