动态添加行数据无法通过PHP获取,如何存入数组?
问题分析与解决方案
首先明确:是的,你需要使用多维数组——每一行的8列数据是一组关联信息,最终要把所有行的数据存成一个包含多个子数组的集合,每个子数组对应一行的完整内容。
你的代码现在出现数组值为null的问题,主要有几个关键原因,我一步步帮你修正:
1. 核心问题排查
- 缺失行数记录字段:你在PHP里用
$index0 = $this->input->post("showindex0");获取总行数,但HTML里没有这个隐藏字段,导致$index0为null,循环根本无法执行。 - 复选框未勾选时无数据:HTML复选框未勾选时,表单不会向服务器发送该字段,直接取
$basic_i[$i]会出现索引缺失,返回null。 - 未累加行数据:当前PHP循环每次都覆盖
$basic_data,没有把每行数据添加到总数组中,最终只会保留最后一行(甚至循环没执行时为空)。
修正后的完整代码
第一步:修改HTML/JS,补充行数记录与删除逻辑
首先在表格外添加隐藏字段存储当前行数:
<input type="hidden" name="showindex0" id="showindex0" value="1">
然后更新JS的addTable0函数,每次添加/删除行后同步更新隐藏字段的值,并修复删除按钮的逻辑:
var index0 = 1; function addTable0() { var table0 = document.getElementById("myTable0"); var row0 = table0.insertRow(2); // 保留你原本创建单元格、插入表单元素的代码 $("#cell9_0").append('<button onclick="deleteTable0(this)" type="button" class="btn btn-danger btn-sm remove"><span class="glyphicon glyphicon-trash"></span></button>'); index0++; // 更新行数记录 document.getElementById("showindex0").value = index0; } // 修复删除行的逻辑 function deleteTable0(btn) { var row = btn.parentNode.parentNode; row.parentNode.removeChild(row); index0--; // 删除后同步更新行数 document.getElementById("showindex0").value = index0; }
同时修改初始行的删除按钮,传递当前元素参数:
<button onclick="deleteTable0(this)" type="button" class="btn btn-danger btn-sm"> <span class="glyphicon glyphicon-trash"></span> </button>
第二步:修正PHP代码,处理复选框与多维数组
现在修改PHP代码,创建总数组存储所有行数据,同时处理复选框未勾选的情况:
// 获取总行数 $index0 = $this->input->post("showindex0"); // 初始化存储所有行数据的多维数组 $basic_data_list = []; for ($i=0; $i < $index0; $i++) { // 处理复选框:未勾选时默认设为0(或false,根据需求调整) $basic_i = $this->input->post("basic_i[$i]") ?? 0; $basic_e = $this->input->post("basic_e[$i]") ?? 0; $basic_pi = $this->input->post("basic_pi[$i]") ?? 0; $basic_pa = $this->input->post("basic_pa[$i]") ?? 0; // 组装当前行的关联数组 $row_data = array( 'basic_category' => $this->input->post("basic_category[$i]"), 'basic_workscope' => $this->input->post("basic_workscope[$i]"), 'basic_i' => $basic_i, 'basic_e' => $basic_e, 'basic_pi' => $basic_pi, 'basic_pa' => $basic_pa, 'basic_ata_chapter' => $this->input->post("basic_ata_chapter[$i]") ); // 将当前行添加到总数组中 $basic_data_list[] = $row_data; } // 可通过print_r($basic_data_list)测试输出所有行数据
额外说明
- 若你使用PHP7.0以下版本,无法使用
??运算符,可替换为isset()判断:$basic_i = isset($this->input->post("basic_i[$i]")) ? 1 : 0; - 确保表单以
method="post"提交,且所有动态生成的表单元素name属性格式(如basic_category[$index0])正确,PHP会自动解析为数组。
内容的提问来源于stack exchange,提问作者Banun Aryani
相关产品推荐
相关产品推荐

