寻求替代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">×</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">×</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">×</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">×</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
相关产品推荐
相关产品推荐

