Domanda:
problema php mysql query?
Marioreds
2012-01-12 14:26:48 UTC
ciao.
premetto che conosco abbastanza a fondo sia php che mysql, i concetti base sono ben assodati, e sto costruendo un sito che pian piano sta facendo il suo dovere.
mi si è però presentato il seguente stranissimo problema

dopo aver settato connessione a mysql e tutto il resto come dovuto,
eseguo col php una query del tipo:

$select1 = "stringa bla bla bla"
$result1 = mysql_query($select1);
while($row1 = mysql_fetch_array($result1)) { //altro codice qui }

Poi avendo bisogno di un altra select dal database riscrivo tutto identico ma usando come nomi di variabile $select2, $result2, $row2, ecc. Fidatevi che sono tutti giusti col numero 2. cambia ovviamente il contenuto della stringa select ma questo è un dettaglio ininfluente.

dopo questa seconda chiamata
ho il bisogno di eseguirne una identica alla prima.
per tale motivo in teoria non dovrei riscrivere la $select1 in quanto è una stringa già definita e mai riassegnata.

e sempre in teoria anche la variabile $result1 è già definita e assegnata.

quindi nel codice mi sono limitato a scrivere, dopo la 2,
un nuovo

while($row1 = mysql_fetch_array($result1)) { //codice qui }

ma il codice del secondo while non parte per niente al mondo!

però, se prima ridefinisco la $result1 = mysql_query($select1) invece va tutto alla perfezione.

Ora.... ho fatto svariati tentativi, credetemi, e non ci dovrebbe essere alcuna ragione logica per questo fatto.. voglio dire: se le variabili non sono mai state riassegnate come cacchio fa il php a dimenticarsi chi è la $result1?

ho provato anche a piazzare un mysql_num_rows($result1) e mi da il numero corretto, quindi $result1 è ancora esistente dopo il while 2, ma non si capisce perché se lo riuso per un ciclo while $row = mysql_fetch_array non giri!

Qualche idea?
Sono io che sbaglio a pretendere di eseguire il secondo while senza ridefinire $result1 o è un bug di php? Secondo me è un bug. Non vedo altra spiegazione. Ma se qualche esperto ha già incontrato un caso del genere, o sa dirmi il motivo per cui non sia possibile eseguire due volte il ketch_array con lo stesso result per favore me lo spieghi! Sto impazzendo! Grazieeee!
Tre risposte:
anonymous
2012-01-13 01:57:08 UTC
Come dice Zedda, il problema è nella tua assunzione errata su $result.



$result "punta" a quello che nel gergo si chiama un "cursore", ovvero ad una struttura dati che contiene sia i dati del risultato della query sia le metainformazioni sui dati stessi e le informazioni sulla riga corrente.



Nel momento in cui chiami la mysql_fetch_array() per lo meno il cursore viene per lo meno "esaurito" e necessiterebbe - se possibile - di un reset per ripristinare la possibilità di navigarlo. Mi pare che in php una cosa del genere manchi.



Dovresti "metterti in cache" le righe del resultset $result se non vuoi eseguire due volte la stessa query - cosa che può essere saggia.
zedda_piras25
2012-01-12 22:56:06 UTC
è qua che sbagli

"e sempre in teoria anche la variabile $result1 è già definita e assegnata."



devi rifare la query chiamando mysql_query altrimenti mysql_fetch_array non ti restituisce niente



come dici tu sarebbe come se



$a = array( un array con n elementi );

$i = 0;

while($i < count($a)){ ... $i++;}



quindi alla fine del while $i == count($a);



e poi rifai

while($i < count($a)){ ... $i++;}

non entra proprio nel while



mysql_fetch_array ha qualcosa di simile al suo interno
Halert
2012-01-12 22:33:11 UTC
secondo me il problema è proprio che fai due select innestate, dal punto di vista dell'efficenza è una soluzione possibile ma non troppo consigliabile, hai provato a pensare di fare tutto in un'unica query con una join, ad esempio? In questo modo stai approcciando ad un linguaggio dichiarativo (SQL) in modo procedurale (PHP), mentre invece le cose dovrebbero rimanere ben distinte.


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...