• User Newbie

    Uno strano while

    Rieccomi qua :arrabbiato:

    Avrei un quesito che mi sta facendo dannare dalle 3 di ieri mattina...

    Probabilmente mi sto distraendo su qualcosa ma, veramente, non riesco a venirne fuori...

    In poche parole sto organizzando delle pseudo librerie...

    In una di queste ho inserito le funzioni di interazione con il database ma con le select a più risultati ho un grosso problema...

    La funzione è questa:

    function select ($select, $from, $where){ 
     
    // Compongo la query 
    $select="select $select from $from where $where"; 
    $select = stripslashes($select); 
    // Eseguo la query e se non va a buon fine mostro l'errore di MySQL 
    $queryselect = mysql_query ($select) or die (mysql_error()); 
    // Associo ad un array il risultato dell'interrogazione 
    $selection = mysql_fetch_assoc ( $queryselect); 
    // Passo l'array al programma 
    return $selection; 
     
    }
    
    

    E la richiamo, ad esempio, con:

    $risultato = select ("UTENTE","TABELLA","ID > 0");
    
    

    Se effettuo:

    while ($risultato){ 
    print $risultato["UTENTE"]; 
    }
    
    

    Mi va in loop ed il browser crasha

    Il risultato è, ad esempio:

    DevilzDevilzDevilzDevilzDevilzDevilz...

    Stampa solo il primo record del risultato all'infinito...

    Mentre il while dovrebbe saltare, dopo la stampa, al secondo record sino a "svuotare" il risultato dell'interrogazione...

    Sapreste darmi una dritta a riguardo...?

    La selezione di un solo record non mi da nessun problema...

    E' quel while che mi sta facendo impazzire...


  • Super User

    ciao,
    l'interrogazione di una variabile come fai tu con:

    while ($risultato)

    da come risultato true se la variabile è piena e da false se la variabile è vuota / == eof / == 0.
    Quindi nel tuo caso entri necessariamente in un loop infinito.

    il risultato della tua funzione (che a mio avviso non ha senso) non deve essere:

    return $selection;

    bensì:

    return $queryselect;

    quindi, nella funzione chiamante potrai impostare il ciclo while in questo modo:

    while ($selection = mysql_fetch_assoc ( $queryselect))
    {
    print $risultato["UTENTE"];
    }

    che vuol dire "fino a quando la funzione mysql_fetch_assoc riesce ad estrarre dal set di risultati $queryselect un record e metterlo nella variabile $selection continua il ciclo.

    prima ho detto che a mio avviso questa funzione non ha senso perchè è una funzione da 2 righe, che ti risparmi? che organizzi?

    onestamente io ho una funzione analoga alla tua che si chiama Getrecord che vuole come parametro la stringa sql ma la uso solo quando so che il risultato può essere sempre e solo un record.

    oppure puoi creare una funzione GetFieldValue dove passi come parametro la solita stringa sql (non dividerla in più variabili, è così comodo averne una sola per farci quello che vuoi) ed un secondo che identifica il campo per il quale vuoi il valore.

    quindi:

    getfieldvalue('select nome from utenti where id = '.$id,'utente');


  • User Newbie

    Uhmmm...strano...

    Mi pareva di averla provata quella soluzione...

    Ho fatto mille prove differenti...

    Il significato di funzioni di questo tipo è solo "temporale" 🙂

    Le sto facendo per risparmiare tempo durante il coding...niente di più 🙂

    Ora provo la tua ovvia soluzione...

    Grazie mille Tymba...sei gentilissimo 🙂


  • User Newbie

    Come volevasi dimostrare...

    
    function select ($select, $from, $where){
     
    // Compongo la query
    $select="select $select from $from where $where";
    $select = stripslashes($select);
    // Eseguo la query e se non va a buon fine mostro l'errore di MySQL 
    $queryselect = mysql_query ($select) or die (mysql_error());
     
    return $queryselect;
     
    }
     
     
    while ($selection = mysql_fetch_assoc (select("UTENTE", "TABELLA", "ID > 0"))){
     
    print $selection["UTENTE"];
     
    }
    
    

    Questa è la funzione con la chiamata...

    Il risultato è il medesimo megaloop...

    A questo punto credo di avere qualche problema concettuale con il ritorno delle funzioni perchè a me questa soluzione appare ovvia come la precedente ma sta di fatto che non gira come dovrebbe...

    Sono costretto ad abbandonare la mia idea per le selezioni multiple...

    Per le selezioni eseguite con num_row tutto è ok perchè ritorno il singolo risultato[0] e non ha nessun tipo di problema, idem per le funzioni di update, delete ed insert che non ritornano nessun parametro...

    Scenderò a questo compromesso...pazienza...

    Grazie ancora Tymba 😉


  • User Attivo

    perché non usi
    while ($selection=mysql_fetch_array(select('Utente','tabella','id>0')){
    ...
    }
    ?

    non so... io ho sempre usato questa funzione per estrarmi i valori dai database... 🙂


  • User Newbie

    Le funzioni array e fetch lavorano, praticamente, allo stesso modo...

    Non cambierebbe nulla 🙂