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 活动记录调用多个存储过程的问题的主要内容,如果未能解决你的问题,请参考以下文章