CodeIgniter批量插入功能异常,请求代码正确性排查
嘿,作为CodeIgniter老玩家,我帮你梳理下这段代码里的几个关键问题,这应该就是批量插入没生效的核心原因:
1. 控制器里的致命错误:未定义的$sql变量
你在执行$cmd3 = $this->Software_model->add_type($data);之后,直接用了foreach($sql->result_array() as $row),但**$sql变量根本没定义**!insert_batch()的返回值是布尔值(成功/失败)或者插入的行数,不是查询结果对象,这里会直接抛出错误,导致后续的add_equip()代码完全不会执行。
如果你想获取刚插入的jobtype表的ID,应该用CodeIgniter的$this->db->insert_id()方法(注意:insert_batch()是批量插入,insert_id()只能返回最后一条插入记录的ID)。修正后的控制器这部分应该是:
$cmd3 = $this->Software_model->add_type($data); if($cmd3){ // 获取最后插入的jobtype的ID $id2 = $this->db->insert_id(); $data2s = array(); foreach($dat as $key => $val){ $data2s[] = array( 'EquipmentName' => $_POST['txt_equipb'][$key], 'EquipmentType' => $_POST['txt_equiptype'][$key], 'RequirementID' => $id2 ); } $cmd2 = $this->Software_model->add_equip($data2s); }
2. JS函数语法错误
你的JS函数定义写错了:function second function(){ 是非法语法,应该改成合法的函数名(比如function addEquipmentType(){),不然这段JS根本执行不了,动态添加的文本框不会被创建,导致txt_equiptype[]数组数据缺失,进而影响后面的批量插入。
修正后的JS代码:
function addEquipmentType(){ var etype = document.createElement('input'); etype.type = 'text'; etype.setAttribute("name", "txt_equiptype[]"); etype.setAttribute("class", "form-control"); // 给动态元素设置唯一ID,避免重复 etype.setAttribute("id", "etype_" + Date.now()); etype.setAttribute("placeholder", "Enter Equipment Type"); document.getElementById('third').appendChild(etype); }
3. 潜在的数据源问题:$dat变量的合法性
你在控制器里用了foreach($dat as $key => $val),但没说明$dat是怎么来的。要确保$dat的长度和所有POST数组(比如$_POST['txt_model_num']、$_POST['txt_accessories']等)的长度一致,否则会出现数组索引越界,导致部分数据缺失。
建议在循环前先打印调试数据,确认所有POST数组的完整性:
// 调试:打印所有POST数据,确认数组结构 var_dump($_POST); // 确认$dat的长度和POST数组长度匹配 echo "dat length: " . count($dat) . "<br>"; echo "model num length: " . count($_POST['txt_model_num']) . "<br>"; die();
4. 数据库字段匹配问题
要确保模型中insert_batch()的数组键名和数据库表的字段名完全一致(包括大小写)。比如jobtype表的字段是不是ModelNumber、Access、SerialNumber这些?如果数据库字段是小写的(比如modelnumber),那批量插入会因为字段不匹配而失败。
可以开启CodeIgniter的数据库调试,查看生成的SQL语句:
在模型的add_type方法里添加:
public function add_type($data) { $this->db->insert_batch('jobtype', $data); // 打印生成的SQL语句,排查字段是否匹配 echo $this->db->last_query(); return $this->db->affected_rows() > 0; }
最后一步:开启错误提示
在CodeIgniter的config.php里开启错误提示,方便快速排查问题:
$config['log_threshold'] = 1; $config['display_errors'] = TRUE;
按照上面的步骤修正后,你的批量插入应该就能正常工作了!
内容的提问来源于stack exchange,提问作者Cedrix Cedrix

