我正在使用最新的codeigniter并尝试从我的模型中调用存储过程。我也使用mysqli作为数据库驱动程序。现在我在调用两个存储过程时遇到错误。以下是错误:
错误号码:2014
命令不同步;你现在不能运行这个命令
调用uspTest();
文件名:E:\ wamp \ www \ reonomy-dev \ system \ database \ DB_driver.php
行号:330
请注意,当我调用单个存储过程时,它可以正常工作。这是模型的代码。
class Menus_model extends CI_Model {
function __construct()
{
parent::__construct();
}
public function getMenus()
{
$query = $this->db->query("call uspGetMenus()");
return $query->result();
}
public function getSubMenus()
{
$query = $this->db->query("call uspTest()");
return $query->result();
}
}
以下是控制器的代码
class MYHQ extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('menus_model');
}
public function index()
{
$menu = $this->menus_model->getMenus();
$submenu = $this->menus_model->getSubMenus();
}
}
是否有任何解决方案没有破解codeigniter的核心?
答案 0 :(得分:20)
我跟随Tim Brownlaw先生的博客:
http://ellislab.com/forums/viewthread/73714/#562711
首先,修改application / config / config.php,第55行。
$db['default']['dbdriver'] = 'mysqli'; // USE mysqli
然后,将以下内容添加到缺少此命令的mysqli_result.php中,原因有些奇怪(在/system/database/drivers/mysqli/mysqli_result.php下)。
/**
* Read the next result
*
* @return null
*/
function next_result()
{
if (is_object($this->conn_id))
{
return mysqli_next_result($this->conn_id);
}
}
然后,在您的模型中添加$result->next_result()
。
以下是我的例子。
function list_sample($str_where, $str_order, $str_limit)
{
$qry_res = $this->db->query("CALL rt_sample_list('{$str_where}', '{$str_order}', '{$str_limit}');");
$res = $qry_res->result();
$qry_res->next_result(); // Dump the extra resultset.
$qry_res->free_result(); // Does what it says.
return $res;
}
答案 1 :(得分:7)
遇到同样的问题我发现了另一种不改变核心的方法,而是使用了一个小帮手。
修改:无法找到以下链接的资源。
参见CoreyLoose帖子。
https://ellislab.com/forums/viewthread/71141/#663206
我不得不对他的助手做出一个小调整。这条线
if( get_class($result) == 'mysqli_stmt' )
可能会产生警告,因为$ result有时会作为布尔值传递。我只是在这一行之前做了一个检查,现在它完美无缺,没有修补核心!
答案 2 :(得分:5)
这似乎是CodeIgniter中的一个错误。为什么它仍然存在于我之外。 但是,有几种方法可以克服它。
点击此处:http://codeigniter.com/forums/viewthread/73714/ 基本上,你修改mysqli_result.php以包含next_result()函数,并确保在每个存储的proc之后调用它。呼叫。 请注意,它假设您使用mysqli作为您的数据库驱动程序......但您可以执行与其他任何类似的操作。您可以在/application/config/database.php中更改驱动程序。这是
行$ db ['default'] ['dbdriver'] ='mysql';
默认情况下。将其更改为:
$ db ['default'] ['dbdriver'] ='mysqli';
您也可以在呼叫之间关闭/重新打开数据库连接,但我肯定会反对这种方法。
答案 3 :(得分:2)
将dbdriver更改为" mysqli" 将此函数放入模型并使用它来调用存储过程
function call( $procedure )
{
$result = @$this->db->conn_id->query( $procedure );
while ( $this->db->conn_id->next_result() )
{
//free each result.
$not_used_result = $this->db->conn_id->use_result();
if ( $not_used_result instanceof mysqli_result )
{
$not_used_result->free();
}
}
return $result;
}