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)
遇到同样的问题,我发现了另一种不改变核心的方法,而是使用了一个小帮手.
编辑:以下链接的资产无处可寻.
请参阅CoreyLoose帖子.
https://ellislab.com/forums/viewthread/71141/#663206
不过,我不得不对他的助手做出一个小小的调整.这条线
if( get_class($result) == 'mysqli_stmt' )
Run Code Online (Sandbox Code Playgroud)
因为$ result有时会作为布尔值传递,所以可能会产生警告.我只是在这一行之前做了一个检查,现在它完美地工作,没有修补核心!
这似乎是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';
您也可以在调用之间关闭/重新打开数据库连接,但我肯定会建议不要使用这种方法.
| 归档时间: |
|
| 查看次数: |
33844 次 |
| 最近记录: |