CodeIgniter 活动记录调用多个存储过程的问题

Posted

技术标签:

【中文标题】CodeIgniter 活动记录调用多个存储过程的问题【英文标题】:CodeIgniter active records' problems calling multiple stored procedures 【发布时间】:2012-07-28 02:27:11 【问题描述】:
class Registration_model extends CI_Model 

    function __construct() 
        parent::__construct();
       

    function check_email_availability($email)
    
        $sql = "CALL proc_1301('$email');"; 
        $query = $this->db->query($sql) or die(mysql_error()); 
        return $query->row_array();
    

    function check_username_availability($username)
    
        $sqlt = "CALL proc_1303('$username');"; 
        $query = $this->db->query($sqlt) or die(mysql_error()); 
        return $query->row_array();
    

    function process_registration($username, $email, $password)
     
        $sql = "CALL `proc_1302`('$username', '$email', '$password');"; 
        $query = $this->db->query($sql) or die(mysql_error()); 
        return $query->result_array();   
    

这是我的控制器代码,它从模型中一一调用三个函数:

$emailCheckRes = $this->Registration_model->check_email_availability($email); 
$usernameCheckRes = $this->Registration_model->check_username_availability($username); 
$this->data['regRes'] = $this->Registration_model->process_registration($username, $email, $password);

我的问题是,当我只运行一个函数时,它运行成功,但是当我运行其中两个或全部三个时,它显示空白页...知道为什么吗???

解决方案

所以最后我们为自己的问题得到的唯一解决方案是:

/* ADD THIS FUNCTION IN SYSTEM/DATABASE/DB_ACTIVE_REC */
/* USAGE $this->db->freeDBResource($this->db->conn_id); */
function freeDBResource($dbh)
    while(mysqli_next_result($dbh))
            if($l_result = mysqli_store_result($dbh))
              mysqli_free_result($l_result);
            
        

【问题讨论】:

请随时将您的解决方案作为答案发布在下面(并将其标记为已接受),以供未来的访问者使用。 【参考方案1】:

问题与CodeIgniter的活动记录和多个数据库存储过程调用有关。

首先检查 dbdriver 参数 (application/config/database.php) 是否设置为 mysqli。 然后,如"Calling a stored procedure from CodeIgniter's Active Record class" question on *** 中所述,将以下函数添加到 system/database/DB_active_rec.php

function freeDBResource($dbh)
    while(mysqli_next_result($dbh))
            if($l_result = mysqli_store_result($dbh))
              mysqli_free_result($l_result);
            
        

..在你的控制器中使用:

$this->db->freeDBResource($this->db->conn_id);

在任何存储过程调用之后。

【讨论】:

但我的 CI 包中没有 DB_active_rec.php 文件。那么在哪里添加呢? @DeepaMG 如果你没有 DB_active_rec.php 文件,我想你使用的是 Codeigniter 3.x 版本。我还没有用实际的 Codeigniter 版本测试过这个 hack。您能否确认您遇到与 CI3 相同的问题?请尝试执行 $this->db->cache_off();在存储过程调用之前,然后 $this->db->cache_on();后。如果它不起作用,您也可以尝试使用 $this->db->close(); $this->db->reconnect();在任何呼叫之间。让我们知道其中一种方法是否有效。 是的,我后来才意识到。我已将其添加到 system/database/drivers/mysqli/mysqli_results.php 中。这对我有用 @deste 它在 CI3 中使用 $this->db->close(); $this->db->initialize();而不是任何调用之间的 reconnect() 【参考方案2】:

模型和控制器似乎没问题。 如果您尝试以下模型:

class Test_model extends CI_Model

   function __construct()
   
      parent::__construct();
   
   function a($a_input)
   
      return($a_input.': a');
   
   function b($b_input)
   
     return($b_input.': b');
   

...然后像这样从控制器调用它:

$this->load->model('Test_model');
    $a_result = $this->Test_model->a('aaa');
    $b_result = $this->Test_model->b('bbb');
    echo($a_result.'<br />'.$b_result);

您可以看到多个函数调用工作正常。

如果您只调用一个,您确定可以正确执行模型中的三个函数中的任何一个吗? 如果是,也许问题可以在您的存储过程中找到......您可以尝试在模型函数中执行普通查询而不是存储过程吗?为了调试您的问题,如果 db_debug 设置为 TRUE,请同时检查您的 /application/config/database.php。

【讨论】:

嗨,我的 db_debug 是 TRUE,我检查了它们工作正常的程序我还单独检查了它们,它们工作得非常好。唯一的问题是当我像上面所说的那样一起运行它们时,它显示空白页面并且实际上没有运行任何功能...... CodeIgniter 似乎不喜欢调用多个存储过程.. 好像它们发生了冲突。在 application/config/database.php dbdriver 参数设置为 mysql 还是 mysqli?你可以尝试设置为“mysqli”吗? 是的,它已经设置为 mysqli,你认为它与 codeignitor 活动记录有关吗..?? 也许我错了,但我认为这就是问题所在。这个问题让我很感兴趣,因为我可能很快需要做同样的事情。也许在 *** 上已经有这个问题的答案:Calling a stored procedure from CodeIgniter's Active Record class 我不喜欢编辑 /system 内容...但是如果它运作良好,请告诉我。 我很高兴知道。伟大的! :-)

以上是关于CodeIgniter 活动记录调用多个存储过程的问题的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 中的多个连接

如何在codeigniter活动记录中获取特定数组

如何在 CodeIgniter 中调用存储过程?

在codeigniter中调用存储过程

尝试使用 CodeIgniter '调用'存储过程

编译原理—运行时存储PL0活动记录