Вызов хранимой процедуры в codeigniter - PullRequest
8 голосов
/ 14 октября 2011

Я использую последний 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 ??

Ответы [ 4 ]

20 голосов
/ 08 февраля 2013

Я слежу за блогом мистера Тима Браунлоу:
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;
}
7 голосов
/ 29 декабря 2011

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

Редактировать: Нижеуказанный связанный ресурс нигде не найден.

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

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

Хотя мне пришлось немного изменить его помощника.Строка

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

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

5 голосов
/ 16 октября 2011

Это похоже на ошибку в 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';

Вы также можете просто закрыть / открыть соединение с БД междузвонки, но я бы определенно советовал против такого подхода.

2 голосов
/ 23 сентября 2014

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...