动态生成的输入值无法传递至PHP POST的问题排查
问题原因与解决方案
核心问题:表单标签结构错误
你的HTML代码中,<form>标签在第一行就直接闭合了:
<form name="values" action="http://127.0.0.1/fmc/admin/products_sizes.php? group_page=1&member_page=1&action=add_size_heading_values" method="post"></form>
后续所有表单控件(下拉框、输入框、提交按钮)都不在表单范围内,即便你能获取部分字段数据是浏览器兼容行为,动态生成的member_values[]输入框也无法被正确提交。
修复步骤
- 调整HTML结构,让
<form>标签包裹所有表单元素:
<form name="values" action="http://127.0.0.1/fmc/admin/products_sizes.php?group_page=1&member_page=1&action=add_size_heading_values" method="post"> <input name="formid" type="hidden" value="bd1acdc9faa900d509359f07527a565269412e8ee0489470cee47e3fecb1ea80" class="form-control"> <tr> <td>4</td> <td> <select name="group_id" class="custom-select" required="" aria-required="true"> <option value="1">Mens T-Shirt</option> <option value="3">Premium Bracelet</option> </select> </td> <td> <input type="hidden" name="member_id" value="4"> <div class="input-group mb-1"> <div class="input-group-prepend"> <span class="input-group-text"> <img src="http://127.0.0.1/fmc/includes/languages/english/images/icon.gif" alt="English"> </span> </div> <input type="text" name="member_name[1]" required="" aria-required="true" class="form-control"> </div> </td> <td id="values"> <input type="text" class="form-control input-sm" name="member_values[]" value="Small"> <input type="text" class="form-control input-sm" name="member_values[]" value="Medium"> <input type="text" class="form-control input-sm" name="member_values[]" value="Large"> </td> <td> <input type="text" name="member_sort" class="form-control" style="width: 60px;"> </td> <td class="text-right"> <button class="btn btn-link" type="submit"> <span class="fas fa-save text-success" aria-hidden="true"></span> </button> </td> </tr> </form> <script> $(document).ready(function() { $('select').on('change', function() { var selectValue = $(this).val(); $.ajax({ type: "POST", url: "ext/scripts/get_sizes.php", data: { selected: selectValue }, success: function (data) { $('#values').html(data); }, error: function (data) { // 处理错误逻辑 } }); }); }); </script>
注意:将原嵌套在select内的script标签移到表单外部,符合HTML规范。
- 修复后端SQL注入风险
get_sizes.php直接拼接用户输入到SQL语句中存在注入风险,改用预处理语句:
$selectedValue = (int)$_POST['selected']; // 强转为整数,匹配字段类型 $sqlQuery = $db->prepare("SELECT * FROM products_sizes where products_sizes_id = ?"); $sqlQuery->bind_param("i", $selectedValue); $sqlQuery->execute(); $result = $sqlQuery->get_result(); $string = $result->fetch_assoc(); $str_arr = explode(",", $string['products_sizes_sizes']); // 用explode替代preg_split更高效 foreach ($str_arr as $id) { echo '<input type="text" class="form-control input-sm" name="member_values[]" value="'. htmlspecialchars($id) .'"> '; }
用htmlspecialchars()转义输出值,避免XSS风险。
- 增加提交前的空值校验
在数据库插入代码中,先判断member_values是否存在:
$member_id = Text::input($_POST['member_id']); $member_sort = Text::input($_POST['member_sort']); $group_id = Text::input($_POST['group_id']); $member_values = $_POST['member_values'] ?? []; if(empty($member_values)) { die("请选择产品尺寸"); // 或返回错误提示 } $a = implode(',', $member_values); foreach ($languages as $l) { $member_name = Text::prepare($_POST['member_name'][$l['id']]); $db->query("INSERT INTO products_sizes_values (products_sizes_values_id, language_id, products_sizes_id, products_sizes_values_name, products_sizes_values, psv_sort_order) VALUES (" . (int)$member_id . ", " . (int)$l['id'] . ", " . (int)$group_id . ", '" . $db->escape($member_name) . "', '" . $a . "', " . (int)$member_sort . ")"); }
额外检查点
- 用浏览器开发者工具(Network标签)查看提交请求的Form Data,确认
member_values[]是否被包含 - 确认动态生成的输入框确实插入到
#values容器中,且该容器在表单范围内
内容的提问来源于stack exchange,提问作者Lee Foster
相关产品推荐
相关产品推荐

