Commands out of sync e distruzione oggetto $db

La discussione sul CMS Made Simple in italiano.

Moderator: magallo

Post Reply
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Commands out of sync e distruzione oggetto $db

Post by nervino »

Ho un problema con un errore SQL che risolvo distruggendo l'oggetto della connessione al DB, e ricreandolo subito dopo.
Volevo chiervi se, secondo voi, ci sono problemi di sorta in una procedura del genere.
Il CMSMS è impostato per usare mysqli ed il codice viene eseguito lato amministrazione.

Spiego brevemente:

1) Chiamo due Stored Procedures (la prima riempie una tabella che viene letta dalla seconda)

2) Effettuo una normale SELECT su un'altra tabella.

A questo punto mi genera l'errore (2014 - Commands out of sync...) che ho provato a risolvere liberando la memoria con mysqli_result::free,  chiudendo la connessione al DB e riaprendola subito dopo. L'errore sparisce ma i dati della query non vengono caricati.
L'unico modo per risolvere (almeno quello che ho trovato io) è stato quello di distruggere l'oggetto $db e ricrearlo.

Code: Select all

$query1->free(); // Libero la memoria occupata dalla seconda SP.
Ma NON RISOLVE L'ERRORE "COMMANDS OUT OF SYNC..."

$db->close(); //Chiudendo la connessione al DB, l'errore sparisce.
Ma i dati della normale query non vengono caricati.

$db=null;
$db = &$gCms->GetDb(); //in questo modo tutto funziona.
Anche se non capisco perché devo distruggere l'oggetto e non basta $query1->free();
Last edited by nervino on Fri Apr 24, 2009 12:28 pm, edited 1 time in total.
luca

Re: Commands out of sync e distruzione oggetto $db

Post by luca »

Sto cercando di risolvere quell'errore da secoli!!!!!
...e l'unico modo in cui sono riuscito ad evitarlo è stato questo:

//apro la connessione
$this->db["connection"] = new mysqli($this->db["host"],$this->db["user"],$this->db["password"],$this->db["database"]);

//eseguo la store procedure
$this->db["connection"]->multi_query($query);
$this->db["result"] = $this->db["connection"]->store_result();   

//e recupero le righe con un ciclo che sfrutta il comando:
$this->db["result"]->fetch_assoc();

//infine eseguo questo comando perchè, per qualche arcano motivo, la chiamata ad una store procedure che esegue UNA singola select, produce DUE recordset in uscita, per cui sono costretto a passare al successivo recordeset (che a me peraltro appare sempre vuoto... A quanto ho capito dovrebbe contenere un eventuale messaggio d'errore, ma non ho sperimentato)
if ($this->db["connection"]->more_results()) $this->db["connection"]->next_result();

e con queste contorte manovre ho evitato l'errore di "out of sync"... per poi scoprire con orrore che non riuscivo più in alcun modo a recuperare il numero delle righe del recordset, ne l'affected_rows...

per capirci:
@mysql_num_rows($this->db["result"]);
@mysql_affected_rows($this->db["connection"]);

non hanno più effetto!

percui sono tristemente tornato all'unico sistema che ha risolto il problema... ossia quello che hai trovato anche tu: Chiudo la connessione e la riapro.
A mio parere, il problema di questa manovra è solo che aumenta il tempo d' esecuzione complessivo... per il resto funziona.

Qualcuno ha qualche altra idea?

Ciao
Luca
Post Reply

Return to “Italian - Italiano”