2011-10-14 19 views
8

Sto utilizzando l'ultimo codeigniter e sto provando a richiamare la stored procedure dal mio modello. Inoltre sto usando mysqli come driver del database. Ora ho un errore quando chiamo due stored procedure. Di seguito è l'errore:Chiamata stored procedure in 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

Si noti che quando chiamo una singola stored procedure funziona correttamente. Ecco il codice per il modello.

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

} 

Ecco il codice dal regolatore

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

} 

Esiste una soluzione senza l'hacking il nucleo di CodeIgniter ??

risposta

5

Questo sembra essere un bug in CodeIgniter. Come mai è ancora lì è oltre me. Tuttavia, ci sono un paio di modi per superarlo.

Controllare qui: http://codeigniter.com/forums/viewthread/73714/ In sostanza, si modifica mysqli_result.php di includere la funzione next_result() e assicurarsi di chiamare dopo ogni proc memorizzato. chiamata. Basta notare che si presume che tu stia usando mysqli come driver DB ... ma probabilmente puoi fare qualcosa di simile con qualsiasi altro. È possibile modificare il driver in /application/config/database.php È la riga che dice

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

per impostazione predefinita. Cambiarlo in:

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

Si potrebbe anche solo vicino/riaprire una connessione DB tra le chiamate, ma avrei sicuramente consigliare contro questo approccio.

+0

Grazie Veggen, Ora sembra che non c'è modo di utilizzarlo senza hacking nucleo di codeigniter? –

+0

Bene, a parte chiudere e riaprire una connessione DB tra le chiamate, no, sembra che non ci sia alcun modo. Ma se è di qualche condoglianza, il cambiamento necessario è molto piccolo. Sto usando un simile attacco al mio attuale progetto :( – kaqqao

+0

O.K. Volevo solo confermarlo, comunque, grazie e buon lavoro;) –

7

Avendo lo stesso problema, ho trovato un altro approccio che non modifica il core, ma utilizza invece un piccolo helper.

Modifica: La risorsa sottostante non è stata trovata.

Vedere il post di CoreyLoose.

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

ho dovuto fare una piccola adjusment al suo aiutante però. La riga

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

potrebbe produrre un avviso poiché il risultato $ a volte viene passato come booleano. Ho appena fatto un controllo prima di questa linea e ora funziona perfettamente, senza armeggiare con il nucleo!

+0

Questo sembra buono. Devo provarlo. – kaqqao

+0

Questo è di gran lunga il metodo meno intrusivo in quanto non richiede modifiche al core CI. Ho usato anche questo. –

+0

nice thanks jonas – Drew

17

seguo il blog di Mr. Tim Brownlaw:
http://ellislab.com/forums/viewthread/73714/#562711

In primo luogo, modificare application/config/config.php, linea 55.

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

Quindi, aggiungere il seguente in mysqli_result. php che manca questo comando per qualche strana ragione (in /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); 
    } 
} 

Quindi, nel modello, aggiungere $result->next_result().

Di seguito è riportato il mio esempio.

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

È possibile simulare lo stesso con il driver pdo? – Dimas

2

cambiamento dbdriver a "mysqli" messo questa funzione per il vostro modello e utilizzarlo per chiamare stored procedure

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; 

} 
Problemi correlati