2011-10-14 15 views
8

Używam najnowszego kreatora kodów i próbuję wywołać procedurę przechowywaną z mojego modelu. Również używam mysqli jako sterownika bazy danych. Teraz mam błąd, gdy wywołuję dwie procedury przechowywane. Poniżej przedstawiono błąd:Wywoływanie procedury składowanej w codeigniter

Error Number: 2014

Commands out of sync; you can't run this command now

call uspTest();

Filename: E:\wamp\www\reonomy-dev\system\database\DB_driver.php

Line Number: 330

Należy pamiętać, że po wywołaniu pojedynczej procedury przechowywanej działa poprawnie. Oto kod dla modelu.

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(); 
} 

} 

Oto kod z kontrolerem

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(); 
} 

} 

Czy istnieje rozwiązanie bez hacking rdzeń CodeIgniter ??

Odpowiedz

5

To wydaje się być błędem w CodeIgniter. Jak to się stało, że wciąż jest poza mną. Istnieje jednak kilka sposobów na pokonanie tego problemu.

Sprawdź tutaj: http://codeigniter.com/forums/viewthread/73714/ Zasadniczo modyfikujesz plik mysqli_result.php w celu włączenia funkcji next_result() i upewnij się, że wywołujesz go po każdym zapisanym procesie. połączenie. Należy pamiętać, że zakłada się, że używasz mysqli jako sterownika DB ... ale prawdopodobnie możesz zrobić coś podobnego z każdym innym. Możesz zmienić swój sterownik w /application/config/database.php Domyślnie jest to linia domyślnie oznaczająca . Zmień go na adres:

$db['default']['dbdriver'] = 'mysqli';

Można też po prostu zamknij/otwórz ponownie połączenie DB pomiędzy rozmowami, ale na pewno odradzam tego podejścia.

+0

Dzięki Veggen, teraz wydaje się, że nie ma sposobu, aby używać go bez hacking rdzeń codeigniter? –

+0

Cóż, poza zamknięciem i ponownym otwarciem połączenia DB między połączeniami, nie wydaje się, aby było inaczej. Ale jeśli chodzi o jakiekolwiek kondolencje, potrzebna zmiana jest bardzo mała. Używam takiego hacka do mojego obecnego projektu :( – kaqqao

+0

O.K. Chciałbym tylko potwierdzić. Anyways, Thanks i Nice work;) –

7

Mając ten sam problem, znalazłem inne podejście, które nie zmienia rdzenia, ale zamiast tego używa małego pomocnika.

Edytuj: Nie można znaleźć poniżej powiązanego zasobu.

Zobacz post CoreyLoose.

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

musiałem zrobić mały adjusment do swojego pomocnika chociaż. Linia może wygenerować ostrzeżenie, ponieważ czasami wynik $ jest przekazywany jako wartość logiczna. Właśnie wystawiłem czek przed tą linią i teraz działa idealnie, bez majstrowania przy rdzeniu!

+0

To wygląda dobrze. Musisz spróbować. – kaqqao

+0

Jest to zdecydowanie najmniej inwazyjna metoda, ponieważ nie wymaga zmian w rdzeniu CI. Użyłem tego również. –

+0

miłe dzięki jonas – Drew

17

śledzę blog pana Tim Brownlaw:
http://ellislab.com/forums/viewthread/73714/#562711

Pierwsza, modyfikowania application/config/config.php, linia 55.

$db['default']['dbdriver'] = 'mysqli'; // USE mysqli 

Następnie dodać następujące do mysqli_result. PHP brakuje tego polecenia z jakiegoś dziwnego powodu (w /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); 
    } 
} 

Następnie w swoim modelu dodaj $result->next_result().

Poniżej znajduje się mój przykład.

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; 
} 
+0

Czy można symulować to samo ze sterownikiem pdo? – Dimas

2

zmiana dbdriver do „mysqli” umieścić tę funkcję do modelu i używać go wywołać procedurę przechowywaną

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; 

} 
Powiązane problemy