CodeIgniter调用SQL Server存储过程查询失败,SQL工具执行正常求助
排查CodeIgniter中调用存储过程无返回数据的问题
我之前在CodeIgniter项目里也碰到过一模一样的问题——存储过程在数据库工具里跑完全正常,但放到CI里就返回空结果。结合你的代码片段,我梳理了几个最常见的原因和对应的解决办法:
1. 存储过程调用语法不符合数据库要求
不同数据库的存储过程调用语法差异很大:
- 如果是MySQL,必须用
CALL关键字触发存储过程,而不是直接写存储过程名加参数; - 如果是SQL Server,建议显式加上
EXEC关键字,避免CI的数据库驱动解析错误。
修改你的Model代码(根据数据库类型二选一):
function GetDataByProc(){ // MySQL版本 $data = $this->db->query("CALL spCekSelisihJurnal('2018-01-01 00:00:00', '2018-12-31 23:00:00')"); // SQL Server版本 // $data = $this->db->query("EXEC spCekSelisihJurnal '2018-01-01 00:00:00', '2018-12-31 23:00:00'"); return $data ; }
2. 日期格式不被数据库正确解析
你用的'1/1/2018 00:00:00'这种短日期格式,在部分数据库的严格模式下会被判定为无效参数,导致存储过程没有输出。建议换成标准的YYYY-MM-DD HH:MM:SS格式,这是所有关系型数据库都能识别的统一格式。
3. 存储过程返回多结果集,CI默认只取第一个
有些存储过程会返回多个结果集(比如包含执行状态码的额外结果),CI的result_array()默认只会读取第一个结果集,如果第一个结果集是空的,就会返回空数组。你需要手动跳过后续的空结果集:
修改Controller里的代码:
public function index(){ $this->load->database(); $this->load->model('model_contoh'); $query = $this->model_contoh->GetDataByProc(); $data = []; // 读取第一个有效结果集 if ($query->num_rows() > 0) { $data = $query->result_array(); } // 清理后续的空结果集,避免影响后续查询 while ($this->db->next_result()) { $this->db->free_result(); } echo '<pre>' ; print_r($data); }
4. CI使用的数据库用户没有执行权限
虽然你在本地SQL工具里能跑存储过程,但CI连接数据库用的账号可能没有EXECUTE该存储过程的权限。登录数据库给CI用户授予权限:
-- MySQL GRANT EXECUTE ON PROCEDURE spCekSelisihJurnal TO 'ci_db_user'@'localhost'; -- SQL Server GRANT EXECUTE ON spCekSelisihJurnal TO ci_db_user;
5. 用查询绑定替代硬编码参数(更安全也更兼容)
CI的数据库类有SQL注入防护机制,硬编码参数偶尔会被误判,改用查询绑定的方式不仅能避免这个问题,还能自动处理参数格式:
修改Model代码:
function GetDataByProc(){ $start_date = '2018-01-01 00:00:00'; $end_date = '2018-12-31 23:00:00'; // MySQL版本 $query = $this->db->query("CALL spCekSelisihJurnal(?, ?)", [$start_date, $end_date]); // SQL Server版本 // $query = $this->db->query("EXEC spCekSelisihJurnal ?, ?", [$start_date, $end_date]); return $query; }
内容的提问来源于stack exchange,提问作者Aji Sanjaya
相关产品推荐
相关产品推荐

