PHP+MySQL绑定admin复选框实现POST提交更新用户管理员权限的方法
第一个问题:绑定checkbox与逻辑的解决方法
你原来的代码存在两个问题导致判断失效:
- checkbox的
name属性没有设为数组格式,且没有绑定对应用户的id作为value,提交时只能拿到最后一个checkbox的状态 $admin_checkbox定义在用户循环外,所有用户共用同一个无差别的checkbox,无法对应到具体用户
修改后的代码如下:
<form action="" method="post"> <input type = "submit" name="sql_update" value="SQL Update"> <?php $getusers = "SELECT id, username, firstname, lastname, admin FROM registered_users"; $result = mysqli_query($db, $getusers); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { // 把checkbox定义移到循环内,name设为数组,value绑定用户id,已是管理员的默认勾选 $admin_checkbox = '<input type="checkbox" name="admin_status[]" value="'.$row["id"].'" '.($row["admin"] == 1 ? 'checked' : '').'>'; echo "<br>". $row["id"]. " - " . $row["username"]. " - " . $row["firstname"]. " - " .$row["lastname"]. " - " .$row["admin"]. " " .$admin_checkbox. "<br>"; } } ?> </form>
修改后提交时,$_POST["admin_status"]会是所有被选中的用户id组成的数组,未勾选任何用户时该值为空,你的empty判断就能正常运行。
第二个问题:反向逻辑(将选中的已有管理员降级)的实现
你更新2里的逻辑其实已经实现了「勾选的用户设为管理员,未勾选的全部取消管理员」的全量更新效果,不需要额外加elseif分支。如果需要单独处理「选中用户原本是管理员就降级」的场景,要先查询选中用户的原有admin状态再分别处理,不过全量更新的方案更简洁。
注意要新增SQL注入防护,修改后的更新2代码优化版:
if (isset($_POST['sql_update'])) { if (empty($_POST["admin_status"])){ echo ("未选中任何用户。"); } else { // 把所有选中的id转成整数,避免SQL注入 $admin_ids = array_map('intval', $_POST['admin_status']); $id_str = implode(',', $admin_ids); // 选中的用户设为管理员 $sql_admin_on = mysqli_query($db, "UPDATE registered_users SET admin = 1 WHERE id IN (".$id_str.") "); echo("SQL写入成功!"); // 未选中的用户取消管理员 $sql_admin_off = mysqli_query($db, "UPDATE registered_users SET admin = 0 WHERE id NOT IN (".$id_str.") "); } }
如果你确实需要单独的elseif分支判断选中用户是否为管理员,可以用以下逻辑:
if (isset($_POST['sql_update'])) { if (empty($_POST["admin_status"])){ echo ("未选中任何元素。"); } // 先查询选中的用户里admin=1的数量,大于0就走降级逻辑 elseif(mysqli_num_rows(mysqli_query($db, "SELECT id FROM registered_users WHERE admin=1 AND id IN (".implode(',', array_map('intval', $_POST['admin_status'])).")")) > 0){ $sql_admin_off = mysqli_query($db, "UPDATE registered_users SET admin = 0 WHERE id IN (".implode(',', array_map('intval', $_POST['admin_status'])).") "); echo("操作完成"); } else { $sql_admin_on = mysqli_query($db, "UPDATE registered_users SET admin = 1 WHERE id IN (".implode(',', array_map('intval', $_POST['admin_status'])).") "); echo("SQL写入成功!"); } }
内容的提问来源于stack exchange,提问作者Koncinaa
相关产品推荐
相关产品推荐

