Вызов хранимой процедуры в 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;
}