CodeIgniter 3分页失效求助:批量向API发送库存数据
问题排查与修复:CodeIgniter 3 分页失效问题
核心错误点
你的分页功能失效主要源于以下几个问题:
- 总数统计错误:使用
count_all('ci_products')会统计整个表的行数,忽略了你之前设置的where条件(用户ID、激活状态等),导致分页计算完全错误。 - 未应用分页参数:查询产品数据时没有添加
limit和offset限制,每次循环都获取全部符合条件的产品,完全没实现分页逻辑。 - 输出逻辑位置错误:JSON生成和输出的代码放在了分页循环的外面,只会处理最后一次循环的结果(而因为每次都查全量数据,最终结果还是全部产品)。
修复后的完整代码
public function sendstocktobl() { if ($_SERVER['REMOTE_ADDR'] !== $this->localhost) { echo $_SERVER['REMOTE_ADDR']; } else { $this->load->database(); $url = get_integration_url('baselinker'); $this->db->select('user_id'); $this->db->where('bl_send_stock', 1); $this->db->where('is_baselinker', 1); $this->db->where('is_active', 1); $resArr = $this->db->get('ci_users')->result_array(); foreach ($resArr as $row) { $user_id = $row['user_id']; $limit = 1000; $offset = 0; $where = "quantity is NOT NULL"; // 正确统计当前用户符合条件的产品总数 $this->db->where($where); $this->db->where('is_active', 1); $this->db->where('user_id', $user_id); $total_results = $this->db->count_all_results('ci_products'); $total_pages = ceil($total_results / $limit); $token = get_bl_token($user_id); $inventoryid = get_bl_inventory($user_id); $blwh = get_bl_warehouse($user_id); for ($page = 1; $page <= $total_pages; $page++) { $arr = [ "inventory_id" => $inventoryid, "products" => [], ]; // 查询当前页的产品数据,添加limit和offset实现分页 $this->db->select('*'); $this->db->where($where); $this->db->where('is_active', 1); $this->db->where('user_id', $user_id); $this->db->limit($limit, $offset); $prodArr = $this->db->get('ci_products')->result_array(); foreach ($prodArr as $prod) { $arr['products'][$prod['id']] = [$blwh => $prod['quantity']]; } // 每一页生成JSON后立即处理(输出或发送API) $preparebl = json_encode($arr); echo $preparebl; // 这里可以添加发送API的逻辑,比如用curl请求$url // $this->send_to_baselinker_api($url, $preparebl, $token); // 更新offset,准备下一页数据查询 $offset += $limit; } } } }
关键修复说明
- 修正总数统计:将
count_all('ci_products')替换为count_all_results('ci_products'),该方法会保留之前设置的where条件,准确统计当前用户符合要求的产品数量。 - 添加分页参数:在产品查询中加入
$this->db->limit($limit, $offset),确保每次只获取当前页的1000条数据。 - 调整输出位置:将JSON生成和输出(或API发送)的代码移到分页循环内部,让每一页数据都能被单独处理。
- 正确更新offset:每次循环后更新
$offset,确保下一页能获取到正确的数据区间。
内容的提问来源于stack exchange,提问作者melvinfree
相关产品推荐
相关产品推荐

