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

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


person Tausif Khan    schedule 14.10.2011    source источник


Ответы (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';

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

person kaqqao    schedule 16.10.2011
comment
Спасибо Veggen, Теперь кажется, что нет возможности использовать его без взлома ядра codeigniter? - person Tausif Khan; 17.10.2011
comment
Ну, кроме закрытия и повторного открытия соединения с БД между вызовами, нет, похоже, нет никакого способа. Но, если это вызывает соболезнования, необходимые изменения очень малы. Я использую такой хак в своем текущем проекте :( - person kaqqao; 17.10.2011
comment
В ПОРЯДКЕ. Просто хотел подтвердить. В любом случае спасибо и приятной работы ;) - person Tausif Khan; 18.10.2011
comment
Рассмотрите возможность изменения принятого ответа на jonas, так как это кажется предпочтительным способом. - person kaqqao; 30.03.2012

Я слежу за блогом г-на Тима Браунлоу:
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;
}
person Norman    schedule 08.02.2013
comment
Можно ли смоделировать то же самое с помощью драйвера pdo? - person Dimas; 21.03.2017

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

Изменить. Нигде нет связанного объекта.

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

https://ellislab.com/forums/viewthread/71141/#663206< /с>

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

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

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

person jonas    schedule 29.12.2011
comment
Это, безусловно, наименее навязчивый метод, поскольку он не требует изменений в ядре CI. Я также использовал это. - person Thomas Daugaard; 24.06.2013
comment
Можете ли вы опубликовать код здесь? Я не могу получить доступ к ссылке, даже если у меня уже есть учетная запись ellislab. Спасибо. - person Agni Pradharma; 06.01.2016
comment
Не могли бы вы обновить ссылку или дать полное решение здесь, так как ссылка не работает. Это высоко ценится. - person chandimak; 08.04.2017
comment
Извините, это было 6 лет назад, и я не знаю, что случилось с codeigniter за это время. - person jonas; 04.07.2017

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

}
person Fredy    schedule 23.09.2014