记录过多时库存盘点页面无法保存且显示空白页
问题分析与解决方案
核心原因
你的问题是PHP的POST数据限制导致表单字段被截断:当条目过多时,表单生成的输入字段数量超过了PHP配置的max_input_vars值,同时POST总数据量可能也超过post_max_size,导致$_POST无法完整接收数据,连save字段都没传进控制器,代码逻辑完全没执行,最终页面空白。
从你描述的124条记录刚好触发问题来看,每个条目对应多个输入字段(item_id、item_name、stocktake_quantity等),124条的总变量数接近PHP默认的max_input_vars=1000阈值,400条的话远超限制,必然触发截断。
解决步骤
1. 调整PHP配置参数
修改PHP的配置文件(php.ini,或者用.htaccess/user.ini根据服务器环境调整):
- max_input_vars:设置为足够大的值,比如
max_input_vars = 5000(如果后续条目更多,可以设到10000),这个参数控制PHP能接收的最大输入变量数。 - post_max_size:确保POST总数据量足够,比如
post_max_size = 20M,避免因数据体积过大被截断。 - memory_limit:可选,适当调高,比如
memory_limit = 64M,避免处理大量数据时内存不足。
修改后重启PHP服务(或web服务器)生效。
2. 优化数据库插入逻辑
当前代码循环中每次执行insert,400条记录会触发400次数据库请求,效率极低且可能导致超时。改成批量插入:
if(isset($_POST['save'])){ $location = $this->input->post('location'); $loc = explode("-",$location,2); $location_id = $loc[0]; $location_name =$loc[1]; $stk_number = $this->input->post('stk_number'); $item_id = $this->input->post('item_id'); $item_name = $this->input->post('item_name'); $measure_unit = $this->input->post('measure_unit'); $barcode = $this->input->post('barcode'); $category_id = $this->input->post('category_id'); $stocktake_quantity = $this->input->post('stocktake_quantity'); $comment = $this->input->post('comment'); $date = $this->input->post('date'); $expiry_date = $this->input->post('expiry_date'); // Save Stock Take $data = array( 'stk_number' => $this->input->post('stk_number'), 'location' => $location_name, 'location_id' => $location_id, 'comment' => $this->input->post('comment'), 'status' => '1', 'created_at' => $this->input->post('date'), 'created_by' => $this->session->userdata('name') ); $this->db->insert('stocktake', $data); $stk_id = $this->db->insert_id(); // 批量收集数据 $batch_data = array(); for ($i = 0; $i < count($stocktake_quantity); $i++) { if($stocktake_quantity[$i] != ''){ $no_expiry = '0'; if($expiry_date[$i] == '0000-00-00'){ $no_expiry = '1'; } $batch_data[] = [ 'stk_number' => $stk_number, 'stk_id' => $stk_id, 'item_id' => $item_id[$i], 'item_name' => $item_name[$i], 'measure_unit' => $measure_unit[$i], 'barcode' => $barcode[$i], 'category_id' => $category_id[$i], 'stocktake_quantity' => $stocktake_quantity[$i], 'no_expiry' => $no_expiry, 'status' => '1', 'detail' => 'stock take', 'date' => $date ]; } } // 批量插入 if(!empty($batch_data)){ $this->db->insert_batch('stocktake_trans', $batch_data); } // Set message $this->session->set_flashdata('stocktake_saved', 'Stock Take has been saved!'); redirect('stocktake'); }
3. 调试验证
- 在控制器开头添加错误输出代码,排查具体错误:
这样如果是配置限制导致的错误,空白页会直接显示error_reporting(E_ALL); ini_set('display_errors', 1);max_input_vars exceeded之类的警告,确认问题根源。 - 检查服务器的PHP错误日志,也能找到对应的报错信息。
内容的提问来源于stack exchange,提问作者CodeLearner
相关产品推荐
相关产品推荐

