在codeigniter中调用存储过程

Tau*_*han 8 mysql stored-procedures codeigniter codeigniter-2

我正在使用最新的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();
}

}
Run Code Online (Sandbox Code Playgroud)

这是控制器的代码

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();
}

}
Run Code Online (Sandbox Code Playgroud)

有没有黑客攻击codeigniter核心的解决方案?

小智 20

我关注Tim Brownlaw先生的博客:http://ellislab.com/forums/viewthread/73714/#562711

首先,修改application/config/config.php,第55行.

$db['default']['dbdriver'] = 'mysqli'; // USE mysqli
Run Code Online (Sandbox Code Playgroud)

然后,将以下内容添加到缺少此命令的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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

然后,在您的模型中添加$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;
}
Run Code Online (Sandbox Code Playgroud)


jon*_*nas 7

遇到同样的问题,我发现了另一种不改变核心的方法,而是使用了一个小帮手.

编辑:以下链接的资产无处可寻.

请参阅CoreyLoose帖子.

https://ellislab.com/forums/viewthread/71141/#663206

不过,我不得不对他的助手做出一个小小的调整.这条线

if( get_class($result) == 'mysqli_stmt' )
Run Code Online (Sandbox Code Playgroud)

因为$ result有时会作为布尔值传递,所以可能会产生警告.我只是在这一行之前做了一个检查,现在它完美地工作,没有修补核心!


kaq*_*qao 5

这似乎是CodeIgniter中的一个错误.为什么它仍然存在于我之外.但是,有几种方法可以克服它.

请在此处查看:http: //codeigniter.com/forums/viewthread/73714/基本上,您修改mysqli_result.php以包含next_result()函数,并确保在每个存储过程后调用它.呼叫.请注意,它假设您使用mysqli作为您的数据库驱动程序......但您可以执行与其他任何类似的操作.您可以在/application/config/database.php中更改驱动程序.这就是说明的行

$ db ['default'] ['dbdriver'] ='mysql';

默认情况下.将其更改为:

$ db ['default'] ['dbdriver'] ='mysqli';

您也可以在调用之间关闭/重新打开数据库连接,但我肯定会建议不要使用这种方法.