在codeigniter中调用存储过程

Posted

技术标签:

【中文标题】在codeigniter中调用存储过程【英文标题】:Calling stored procedure in codeigniter 【发布时间】:2011-12-07 17:01:26 【问题描述】:

我正在使用最新的 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核心的解决方案??

【问题讨论】:

【参考方案1】:

我关注 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;

【讨论】:

可以用pdo驱动模拟吗?【参考方案2】:

遇到同样的问题,我找到了另一种方法,它不会改变核心,而是使用一个小助手。

编辑:找不到以下链接的资产。

查看 CoreyLoose 的帖子。

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

不过,我不得不对他的助手做一个小小的调整。线

if( get_class($result) == 'mysqli_stmt' )

可能会产生警告,因为 $result 有时会作为布尔值传递。我只是在这条线之前打了个勾,现在它可以完美运行,无需修改核心!

【讨论】:

这是迄今为止侵入性最小的方法,因为它不需要更改 CI 核心。我也用过这个。 你能把代码贴在这里吗?即使我已经有一个 ellislab 帐户,我也无法访问该链接。谢谢。 能否请您更新参考或在此处提供完整的解决方案,因为链接不起作用。非常感谢。 对不起,这是 6 年前的事了,我不知道这段时间 codeigniter 发生了什么。【参考方案3】:

这似乎是 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';

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

【讨论】:

谢谢Veggen,现在看来不破解codeigniter的核心就没有办法使用了? 好吧,除了关闭和重新打开调用之间的数据库连接之外,不,似乎没有办法。但是,如果有任何吊唁的话,所需的改变是非常小的。我正在我当前的项目中使用这样的 hack :( 好的。只是想确认一下。无论如何,谢谢,干得好;) 考虑将接受的答案更改为 jonas',因为这似乎是首选方式。【参考方案4】:

将 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;


【讨论】:

以上是关于在codeigniter中调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何在 codeigniter 代码中使用两个或多个存储过程?

存储过程将codeigniter与mysql数据库断开连接

在 codeigniter 中处理存储过程输出参数

如何在codeigniter中使用存储过程的结果集