提交表单时如何携带选中选项所属optgroup的对应值?
如何传递select中选中选项所属optgroup的值到后端处理脚本?
首先看你提供的原PHP生成表单代码:
<?php $kategorie = $pdo->prepare("SELECT kategorie FROM tdgm_kategorien"); $kategorie->execute(array()); ?> <select name="rubrik" id="where" class="input"> <?php while($r = $kategorie->fetch()) { $kat = $r['kategorie']; ?> <optgroup label="<?= htmlspecialchars($r['kategorie'], ENT_COMPAT, 'UTF-8') ?>" value="<?= htmlspecialchars($r['kategorie'], ENT_COMPAT, 'UTF-8') ?>"> <?php $rubrik = $pdo->prepare("SELECT rubrik FROM ".$r['kategorie'].""); $rubrik->execute(array());?> <?php while($e = $rubrik->fetch()) { ?> <option class="option" value="<?= htmlspecialchars($e['rubrik'], ENT_COMPAT, 'UTF-8') ?>"> <?= htmlspecialchars($e['rubrik'], ENT_COMPAT, 'UTF-8') ?> </option><?php } ?></optgroup><?php } ?> </select>
需要注意:HTML规范里<optgroup>标签并不支持value属性,你现在写的value属性无效,表单提交时只会传递选中<option>的value值,无法直接获取optgroup对应的分类值。下面是几种可行的解决方法:
方法一:将optgroup信息嵌入option的value中
把分类(kategorie)和选项(rubrik)拼接成字符串作为option的value,后端接收后拆分即可。
修改生成option的PHP代码:
<option class="option" value="<?= htmlspecialchars($kat . '|' . $e['rubrik'], ENT_COMPAT, 'UTF-8') ?>"> <?= htmlspecialchars($e['rubrik'], ENT_COMPAT, 'UTF-8') ?> </option>
后端处理脚本中拆分获取两个值:
if (isset($_POST['rubrik'])) { // 用explode拆分,第二个参数2确保只拆分成两部分,避免rubrik包含|符号的情况 list($kategorie, $rubrik) = explode('|', $_POST['rubrik'], 2); // $kategorie即所属optgroup的分类值,$rubrik是选中的选项值 }
方法二:用隐藏字段配合JavaScript
在表单中添加一个隐藏输入框,通过JavaScript监听select的选择事件,将选中选项所属optgroup的label值(即分类值)赋给隐藏字段,提交时一起传递到后端。
- 修改表单,添加隐藏字段:
<input type="hidden" name="kategorie" id="selected-kategorie"> <select name="rubrik" id="where" class="input"> <!-- 原有的optgroup和option代码保持不变 --> </select>
- 添加JavaScript代码:
// 监听select的选择变化事件 document.getElementById('where').addEventListener('change', function() { const selectedOption = this.options[this.selectedIndex]; // 获取选中选项所属optgroup的label值 const optgroupLabel = selectedOption.parentElement.label; // 赋值给隐藏字段 document.getElementById('selected-kategorie').value = optgroupLabel; });
后端处理时直接获取:
$selectedKategorie = $_POST['kategorie']; // 所属optgroup的分类值 $selectedRubrik = $_POST['rubrik']; // 选中的选项值
方法三:后端反向查询数据库
如果不想修改前端,可以在后端拿到选中的rubrik值后,反向查询它所属的kategorie。需要注意:原数据库中每个kategorie对应一张表的设计不太合理,建议调整为用一张rubriken表,通过外键关联到kategorien表,这样查询更高效。
假设调整数据库结构后,后端查询代码示例:
if (isset($_POST['rubrik'])) { $stmt = $pdo->prepare("SELECT k.kategorie FROM tdgm_rubriken r JOIN tdgm_kategorien k ON r.kategorie_id = k.id WHERE r.rubrik = ?"); $stmt->execute([$_POST['rubrik']]); $kategorie = $stmt->fetchColumn(); }
内容的提问来源于stack exchange,提问作者Christian Radtke
相关产品推荐
相关产品推荐

