CodeIgniter中Ajax POST参数无法传递到Model层问题咨询
问题原因与修复方案
你的代码存在3处明确错误,直接导致参数传递异常和功能报错:
- 核心错误:控制器调用模型传参时存在变量拼写/赋值问题。你在控制器中把AJAX传入的参数存在
$lastid变量中,若实际代码里调用模型方法时误传入了未定义的$last_id变量(和模型形参同名但控制器内从未给该变量赋值),传入模型的参数就会是NULL,最终生成的SQL语句缺失id <后的对比值,触发语法错误。即使你贴出的代码里传的是$lastid,也要确认控制器中获取参数后没有被其他逻辑覆盖为空、没有意外unset该变量。 - 语法错误:控制器返回结果时函数名拼写错误,
jsone_encode是错误写法,正确的PHP内置JSON编码函数是json_encode,拼写错误会导致返回格式异常,前端无法正常解析结果。 - 冗余错误:模型层重复调用了两次
$this->db->order_by('id desc');,会让最终生成的SQL出现重复的ORDER BY子句,虽然不会直接阻断执行,但属于无效冗余代码,删除其中一处即可。 - 前端兼容问题:AJAX请求未声明返回数据类型,建议补充
dataType: 'json'配置,避免前端拿到非JSON格式数据时解析失败。
修复后可直接运行的代码
AJAX请求代码
function loadmore(){ var pid = $('#last_id').val(); // 建议把base_url定义在全局公共位置,不要写在函数内部重复声明 var base_url = "<?php echo base_url(); ?>"; $.ajax({ type : "post", url: base_url+"News/loadmore_news", data : {'pid' : pid}, dataType: 'json', // 补充声明返回格式为JSON success : function(res){ for(var i=0;i<res.length;i++){ // 业务逻辑 } } }); }
控制器代码
function loadmore_news(){ $lastid = intval($this->input->post('pid')); // 转成整数类型,过滤非法参数 // 加一层参数非空校验,空值直接返回空数组避免SQL报错 if($lastid <= 0){ echo json_encode([]); return; } $more_news = $this->news_model->get_more_news($lastid); echo json_encode($more_news); // 修正函数拼写错误 }
模型层代码
function get_more_news($last_id){ // 加一层参数兜底校验,避免空值触发SQL错误 if(intval($last_id) <= 0){ return []; } $this->db->select('*'); $this->db->from('press'); $this->db->where(array( 'id <' => intval($last_id), // 强制转整数,同时防范SQL注入 'domain_id'=> config_item('domain_id') )); $this->db->order_by('id desc'); // 删除重复的order_by调用 $this->db->limit(6); $query = $this->db->get(); return $query->result(); }
修复后生成的正确SQL示例
SELECT * FROM `press` WHERE `id` < 123 AND `domain_id` = '86' ORDER BY `id` desc LIMIT 6
不会再出现id < AND的语法错误。
内容的提问来源于stack exchange,提问作者Hamza Zafeer
相关产品推荐
相关产品推荐

