Вызов хранимой процедуры в codeigniter

Я использую последний CodeIgniter и пытаюсь вызвать хранимую процедуру из моей модели. Также я использую mysqli в качестве драйвера базы данных. Теперь у меня возникает ошибка при вызове двух хранимых процедур. Следующие ошибки:

Код Ошибки:

команды синхронизации; вы не можете запустить эту команду

вызовите uspTest ();

Именем: E:wampwwwreonomy-devsystemdatabaseDB_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??

4 ответов


кажется, это ошибка в 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';

вы также можете просто закрыть / снова открыть соединение DB между вызовами, но я определенно не советую такой подход.


Я следую в блоге г-на Тима 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.РНР.)

/**
  * 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;
}

имея ту же проблему, я нашел другой подход, который не меняет ядро, а вместо этого использует небольшой помощник.

Edit: ниже связанный актив нигде не найден.

см. сообщение CoreyLoose.

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

мне пришлось сделать небольшое дополнение к его помощнику. Линия

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

может производить предупреждение с $result иногда передается как логическое значение. Я просто поставил чек перед этой линией, и теперь он работает отлично, без возни с ядром!


изменить 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;

}