You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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();

代码关键说明

  1. 精准统计预订数量:通过COUNT(*)直接在SQL里统计符合条件的记录数,比拉取所有记录再统计高效得多,而且只针对用户当前选择的日期和时间
  2. 预处理语句的使用:所有和用户输入相关的参数都用bind_param绑定,彻底避免SQL注入风险,这是新手开发必须养成的好习惯
  3. 逻辑判断优化:只有当用户选择的是5-8人桌时,才触发满员检测,其他桌型不受限制(完全符合你的需求)
  4. 参数安全处理:用?? ''处理参数,避免未提交参数时出现报错,你还可以进一步添加参数校验(比如验证邮箱格式、日期是否合法等)

内容的提问来源于stack exchange,提问作者Ben W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:54:38