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

寻求替代if语句的SQL查询方案,解决按钮触发后多条件执行异常问题

问题分析

你的核心问题在于:当点击approveBtn时,两个独立的if(isset($_POST['approveBtn']))代码块会依次执行——不管第一个UPDATE是否匹配用户的race,第二个都会尝试执行。这就导致要么出现成功+错误的混合提示,要么只执行其中一个但逻辑混乱。

另外,你的代码存在严重的SQL注入风险,直接将$id这类变量拼接进SQL语句是非常不安全的,必须修复这个问题。

解决方案

我们需要先获取当前用户的race信息,再通过条件分支执行对应的更新操作,同时使用预处理语句避免注入:

<?php
if(isset($_POST['approveBtn'])){
    // 第一步:先获取当前用户的race信息(假设id是当前用户的标识)
    $getRaceQuery = "SELECT race FROM bbee WHERE id = ?";
    $stmt = mysqli_prepare($connection, $getRaceQuery);
    mysqli_stmt_bind_param($stmt, "i", $id);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    $user = mysqli_fetch_assoc($result);
    
    if(!$user){
        // 用户不存在的情况
        ?>
        <div class="errormsg alert alert-autocloseable-danger">
            <a href="#" class="close" data-dismiss="alert">&times;</a>
            <p align="center"> 用户不存在,请检查ID </p>
        </div>
        <?php
        mysqli_stmt_close($stmt);
        exit;
    }
    
    $userRace = $user['race'];
    $updateSuccess = false;
    $levelMessage = "";
    
    // 第二步:根据race执行对应的更新
    $updateQuery = "UPDATE bbee SET status = ? WHERE id = ?";
    $stmt = mysqli_prepare($connection, $updateQuery);
    
    if($userRace === 'Black'){
        mysqli_stmt_bind_param($stmt, "ii", 1, $id);
        $levelMessage = "You are a level 1 B-BBEE Contributor";
    } elseif($userRace === 'White'){
        mysqli_stmt_bind_param($stmt, "ii", 2, $id);
        $levelMessage = "You are a level 2 B-BBEE Contributor";
    } else {
        // 处理其他种族的情况(如果需要)
        ?>
        <div class="errormsg alert alert-autocloseable-danger">
            <a href="#" class="close" data-dismiss="alert">&times;</a>
            <p align="center"> 未匹配到对应的评分规则 </p>
        </div>
        <?php
        mysqli_stmt_close($stmt);
        exit;
    }
    
    // 执行更新并返回结果
    if(mysqli_stmt_execute($stmt)){
        $updateSuccess = true;
    }
    
    mysqli_stmt_close($stmt);
    
    // 显示提示信息
    if($updateSuccess){
        ?>
        <div class="successmsg alert alert-autocloseable-success">
            <a href="#" class="close" data-dismiss="alert">&times;</a>
            <p align="center"> <?php echo $levelMessage; ?> </p>
        </div>
        <?php
    } else {
        ?>
        <div class="errormsg alert alert-autocloseable-danger">
            <a href="#" class="close" data-dismiss="alert">&times;</a>
            <p align="center"> An error occured, Could not approve business </p>
        </div>
        <?php
    }
}
?>
关键改进点
  • 先获取用户信息再分支:不再盲目执行两个UPDATE,而是先查询用户的race,再根据值选择对应的更新逻辑,确保只执行一次正确的更新。
  • 使用预处理语句:通过mysqli_prepare、mysqli_stmt_bind_param绑定参数,彻底避免SQL注入风险,这是生产环境代码的必备要求。
  • 单一结果提示:不管成功还是失败,只会显示一个提示框,不会出现混合的成功/错误信息。
  • 完善异常处理:增加了用户不存在、种族未匹配的情况处理,逻辑更健壮。

如果后续需要加入gender的判断逻辑,只需要在获取用户信息时同时查询gender,然后在条件分支中扩展判断即可(比如if($userRace === 'Black' && $userGender === 'Female')之类的规则)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:52:14