PHP开发:如何隐藏下拉选择框中已存在于数据库的option值
核心实现思路
你需要先把当前用户已分配的所有flag_id存入数组,再遍历全量flag列表时过滤掉数组中已存在的id即可,原代码还存在标签错位、运算符使用错误的问题,完整修复方案如下:
<?php $assigned_flags = []; // 存储当前用户已分配的flag_id $sql = "SELECT * FROM flag_info INNER JOIN infraction_flags ON flag_info.flag_id = infraction_flags.flag_id WHERE ban_id = ?;"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $banId); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows != 0) { echo "<table width='85%'>"; while ($row = $result->fetch_assoc()) { $id = $row['flag_id']; $assigned_flags[] = $id; // 把已分配的id存入数组 $longName = $row['flag_long_name']; echo "<tr>"; echo "<td>".$longName . " </td>"; echo "<td>"; // 每个删除按钮对应单独表单,放在td内避免结构错乱 echo "<form action='includes/deleteFlags.inc.php' method='POST'>"; echo "<input type='hidden' name='ban_id' value='" . $banId . "'>"; echo "<input type='hidden' name='flag_id' value='" . $id . "'>"; echo "<input type='submit' name='delete' value='[X]'>"; echo "</form>"; echo "</td>"; echo "</tr>"; } echo "</table>"; } echo "<hr>"; $sql3 = "SELECT * FROM flag_info"; $stmt = $conn->prepare($sql3); $stmt->execute(); $result = $stmt->get_result(); echo "<form action='includes/assignFlags.inc.php' method='POST'>"; echo "<select name='flag_id'>"; while ($flg = $result->fetch_assoc()) { // 仅当flag_id不在已分配数组中时才渲染选项 if (!in_array($flg['flag_id'], $assigned_flags)) { echo "<option value='" . $flg['flag_id'] . "'>" . $flg['flag_long_name'] . "</option>"; } } echo "</select>"; echo "<input type='hidden' name='ban_id' value='" . $banId . "' size='1'>"; echo "<input type='submit' name='submit'>"; echo "</form>"; ?>
关键修改说明
- 新增
$assigned_flags数组存储当前用户所有已分配的flag_id,避免只保留最后一个id的问题 - 修正option显示逻辑:用
!in_array()判断当前flag未分配才输出,替换原来错误的赋值运算符和反向判断逻辑 - 修复HTML结构错误:删除表单移至对应td内部,闭合标签位置同步调整,避免页面渲染异常
- 兼容无已分配flag的场景:
$assigned_flags为空数组时所有flag都会正常展示
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

