如何检测MySQL表中重复预订?PHP新手开发求助
解决5-8人桌重复预订检测问题
嘿,我来帮你搞定这个重复预订检测的问题!你的代码逻辑有几个关键的小问题,我一步步给你梳理和修正:
你的代码里的核心问题
- 未针对当前用户提交的日期时间过滤查询:你现在的
SELECT * FROM tables会拉取所有预订记录,但实际上你需要检测的是用户当前选择的日期+时间下,5-8人桌的预订次数 - 统计逻辑错误:
$nombre_table = $nombre_res == "5-8";得到的是一个布尔值(true/false),用count()去统计布尔值完全不对,根本没法得到符合条件的预订数量 - 存在SQL注入风险:直接把
$_GET参数拼进INSERT语句里,很容易被恶意攻击,必须用预处理语句来避免这个问题
修正后的完整代码
require_once("config.php.inc"); $idConnexion = new mysqli($serveur, $utilisateur, $motDePasse, $bd, $port); // 检查数据库连接 if ($idConnexion->connect_error) { die('Erreur de connexion (' . $idConnexion->connect_errno . ') ' .$idConnexion->connect_error); } // 先获取用户提交的参数(建议后续补充参数格式校验,比如邮箱、日期合法性等) $email = $_GET['email'] ?? ''; $nombrePersonnes = $_GET['nombre_personne'] ?? ''; $dateRes = $_GET['date_res'] ?? ''; $heureRes = $_GET['heure_preference'] ?? ''; // 重点:统计当前日期+时间下,5-8人桌的预订数量 $countQuery = "SELECT COUNT(*) AS total FROM tables WHERE nombre_personnes = ? AND date_res = ? AND heure = ?"; $stmt = $idConnexion->prepare($countQuery); // 绑定参数:s代表字符串类型,三个参数对应SQL里的三个? $stmt->bind_param("sss", "5-8", $dateRes, $heureRes); $stmt->execute(); // 获取统计结果 $result = $stmt->get_result(); $row = $result->fetch_assoc(); $totalReservations = $row['total']; // 判断是否超过预订上限 if ($nombrePersonnes === "5-8" && $totalReservations >= 2) { echo "抱歉,该桌已订满,请选择其他时间或日期"; } else { // 使用预处理语句插入新预订,彻底避免SQL注入 $insertQuery = "INSERT INTO `tables` (email, nombre_personnes, date_res, heure) VALUES (?, ?, ?, ?)"; $insertStmt = $idConnexion->prepare($insertQuery); $insertStmt->bind_param("ssss", $email, $nombrePersonnes, $dateRes, $heureRes); if ($insertStmt->execute()) { $message = "L'ajout de la réservation a été fait avec succès!"; include("succes_interface.php"); } else { die("La requête a échouée! : (" . $idConnexion->errno . ") " . $idConnexion->error); } } // 关闭语句和数据库连接 $stmt->close(); $insertStmt->close(); $idConnexion->close();
代码关键说明
- 精准统计预订数量:通过
COUNT(*)直接在SQL里统计符合条件的记录数,比拉取所有记录再统计高效得多,而且只针对用户当前选择的日期和时间 - 预处理语句的使用:所有和用户输入相关的参数都用
bind_param绑定,彻底避免SQL注入风险,这是新手开发必须养成的好习惯 - 逻辑判断优化:只有当用户选择的是5-8人桌时,才触发满员检测,其他桌型不受限制(完全符合你的需求)
- 参数安全处理:用
?? ''处理参数,避免未提交参数时出现报错,你还可以进一步添加参数校验(比如验证邮箱格式、日期是否合法等)
内容的提问来源于stack exchange,提问作者Ben W.
相关产品推荐
相关产品推荐

