从双数组填充的下拉框获取排班表单值失败问题排查
问题分析与解决方案
你遇到的核心问题是表单元素的命名方式不对,导致提交后无法获取到完整的值班数据。现在你的所有<select>标签的name都是rostered,当表单提交时,同名的表单元素值会被最后一个覆盖,自然拿不到所有的值班信息。
修复步骤:
修改表单元素的name属性为数组格式
要按周数和团队来区分每个选择框,把name="rostered"改成name="roster[<?php echo $wknumber; ?>][<?php echo $i; ?>]"。这样提交后,你就能在save.php里通过$_POST['roster']拿到一个二维数组,键是周数和团队名,值是选中的员工ID。回显已有的值班数据(添加selected属性)
你的现有代码没有根据$roster数组设置选中状态,编辑页面没法显示已有的值班安排。需要在循环生成<option>的时候,判断当前员工ID是否在对应周的值班列表里,如果是就加上selected属性。
修改后的核心代码片段:
foreach (range(0, 52) as $wknumber) { echo "<tr>"; echo "<td>"; echo "week ".$wknumber; echo "</td>"; foreach ($uniqueteams as $team) { // 先找到当前周对应的值班ID列表 $currentRosterIds = []; foreach ($roster as $r) { // 假设$roster里的第一个元素是日期范围,后面的是ID if (strpos($r[0], "week ".$wknumber) !== false) { $currentRosterIds = array_slice($r, 1); break; } } echo "<td><div><select name=\"roster[{$wknumber}][{$team}]\">".PHP_EOL; foreach ($staff as $row){ if ($row['Team']==$team){ // 判断当前员工ID是否在值班列表里,设置selected $selected = in_array($row['ID'], $currentRosterIds) ? 'selected' : ''; echo '<option value="'.$row['ID'].'" '.$selected.'>'.$row['Name'].'</option>'.PHP_EOL; } } echo "</select></div></td>".PHP_EOL; } echo "</tr>"; // 别忘了闭合<tr>标签,你原来的代码漏了这个! }
补充说明:
- 你原来的代码在
foreach (range(0, 52) as $wknumber)循环里没有闭合<tr>标签,这会导致HTML结构错误,也可能影响表单提交,一定要加上echo "</tr>";。 - 在
save.php里,你可以通过print_r($_POST['roster'])来查看提交后的完整数据,然后再按照你的需求处理(比如写入CSV)。
内容的提问来源于stack exchange,提问作者Daz
相关产品推荐
相关产品推荐

