PHP中如何在while循环内通过if条件完成数据库数据插入?
问题排查与修复方案
核心问题梳理
- 校验逻辑完全错误
现有校验SQLSELECT * FROM grouptbl WHERE groupCreator ='$member_request'只校验了当前用户是不是任意群组的创建者,完全没有关联到当前要申请的群组,只要用户创建过任意群,所有申请都会触发You are a member of this group!错误,不会进入else分支。
- 校验逻辑完全错误
- 提交逻辑位置错误
表单提交判断写在while循环内部,提交一次请求会触发所有循环项的校验和插入逻辑,最终只会插入循环最后一条群组的申请数据,不是用户点击的对应群组。
- 提交逻辑位置错误
- 表单缺少标识字段
所有表单没有携带对应群组的唯一标识,提交后无法识别用户要申请的是哪个群组。
- 表单缺少标识字段
- 存在SQL注入风险
直接拼接用户输入/SESSION数据到SQL语句,存在严重注入漏洞。
- 存在SQL注入风险
修复步骤
第一步:调整代码结构,把提交处理逻辑移到循环外
第二步:修正校验SQL,同时匹配用户ID和申请的群组
第三步:给表单添加隐藏字段传递群组标识
第四步:使用预处理语句规避SQL注入风险
修复后完整代码
<?php // 把提交处理逻辑放到循环最前面 $error = ''; $msg = ''; if (isset($_POST['submit'], $_POST['group_requested'])) { $member_request = $_SESSION['id']; $group_requested = $_POST['group_requested']; // 修正校验SQL:同时校验用户和当前申请的群组 // 注意:如果grouptbl存的是所有群成员,需要把字段groupCreator改成对应成员ID字段 $check_sql = "SELECT * FROM grouptbl WHERE groupCreator = ? AND groupName = ?"; $stmt = mysqli_prepare($con, $check_sql); mysqli_stmt_bind_param($stmt, "ss", $member_request, $group_requested); mysqli_stmt_execute($stmt); $check_result = mysqli_stmt_get_result($stmt); if (mysqli_num_rows($check_result) > 0) { $error = "You are a member of this group!"; } else { // 插入用预处理 $insert_sql = "INSERT INTO `tblrequest`(`member_request`, `group_requested`, `status`) VALUES (?, ?, 1)"; $stmt_insert = mysqli_prepare($con, $insert_sql); mysqli_stmt_bind_param($stmt_insert, "ss", $member_request, $group_requested); if(mysqli_stmt_execute($stmt_insert)){ $msg = "now you requested to ".$group_requested; } } } ?> <?php while ($row= mysqli_fetch_assoc($result)): ?> <table> <tr> <td> <p><?php echo htmlspecialchars($row['groupName']);?></p> <p><?php echo htmlspecialchars($row['groupPhoneNumber']);?></p> </td> </tr> <tr> <td> <!-- 错误/提示信息输出位置按需调整 --> <?php if($error): ?> <p class="text-danger"><?php echo $error; ?></p> <?php endif; ?> <?php if($msg): ?> <p class="text-success"><?php echo $msg; ?></p> <?php endif; ?> <form method="post"> <!-- 添加隐藏字段传递当前群组名,也可以用群组ID更稳妥 --> <input type="hidden" name="group_requested" value="<?php echo htmlspecialchars($row['groupName']); ?>"> <button type="submit" name="submit" class="btn btn-success waves-effect waves-light">ask</button> </form> </td> </tr> </table> <?php endwhile; ?>
额外说明
如果你的grouptbl只存储群组的创建者信息,不存储所有群成员,那么你需要修改校验SQL到对应存储群成员的表查询,才能正确判断用户是否已经是该群的成员。
内容的提问来源于stack exchange,提问作者Meston Enock
相关产品推荐
相关产品推荐

