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

MySQLi更新操作加载缓慢/超时问题排查求助

RSVP状态更新超时/卡顿问题排查与修复

核心问题分析

你的代码存在三个关键问题,直接导致了更新超时、逻辑混乱的情况:

1. 无限循环触发超时

你在处理POST请求时使用的do-while循环,依赖的$inTotal是在请求处理前查询的固定值,循环内部没有重新获取最新的用户总数。只要初始的$inTotal <=8,这个循环就会无限重复执行同一个UPDATE语句,持续占用数据库连接,最终导致服务器超时。

2. SQL注入风险

所有SQL语句都直接拼接$_SESSION[emailAddress]这类用户可控变量,没有使用参数绑定,存在严重的SQL注入漏洞,同时也不符合安全编码规范。

3. 逻辑顺序错误

  • 先执行RSVP更新,再判断是否需要将用户设为候补,导致不必要的重复数据库操作;
  • 跳转语句仅在特定分支执行,其他情况用户提交后页面无响应。

修正后的代码

<?php
include_once 'header.php';
require_once 'includes/dbh.inc.php';
require_once 'includes/functions.inc.php';

if (isset($_SESSION["emailAddress"])) {
    // 参数绑定查询当前用户信息,避免SQL注入
    $sql = "SELECT * FROM users WHERE email = ?";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "s", $_SESSION["emailAddress"]);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($result);
    mysqli_stmt_close($stmt);

    if (isset($_POST['apply'])) {
        $rsvp = $_POST['status'];
        $email = $_SESSION['emailAddress'];
        
        // 实时查询当前"in"状态的用户总数
        $inGet = "SELECT COUNT(*) AS in_total FROM users WHERE rsvp='in';";
        $inData = mysqli_query($conn, $inGet);
        $inRow = mysqli_fetch_assoc($inData);
        $inTotal = $inRow['in_total'];

        // 确定最终要设置的RSVP状态
        $finalRsvp = ($rsvp === "in" && $inTotal >=9) ? "waitlist" : $rsvp;

        // 参数绑定执行单次更新
        $sqlUpdate = "UPDATE users SET rsvp = ? WHERE email = ?";
        $stmtUpdate = mysqli_prepare($conn, $sqlUpdate);
        mysqli_stmt_bind_param($stmtUpdate, "ss", $finalRsvp, $email);
        mysqli_stmt_execute($stmtUpdate);
        mysqli_stmt_close($stmtUpdate);

        // 统一跳转,确保操作后反馈
        header("Location: dashboard.php");
        exit();
    }

    // 页面渲染时需要的in总数,放在POST处理外部
    $inGet = "SELECT COUNT(*) AS in_total FROM users WHERE rsvp='in';";
    $inData = mysqli_query($conn, $inGet);
    $inRow = mysqli_fetch_assoc($inData);
    $inTotal = $inRow['in_total'];
}
?>

关键优化点

  • 移除无限循环,改为单次数据库更新:用户的RSVP状态只需更新一次,循环完全没有必要;
  • 全量使用参数绑定:彻底消除SQL注入风险,同时提升数据库查询的稳定性;
  • 调整逻辑顺序:先判断状态再执行更新,避免多余操作;
  • 统一跳转逻辑:确保用户提交操作后一定会得到页面反馈,避免无响应情况。

内容的提问来源于stack exchange,提问作者TonZaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:15:39