Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Chiamata multipla di query

    Buonasera.

    Questo il mio problema.
    Ho una tabella nella quale ogni record contiene dati relativi ad un CD musicale (titolo, autore, ecc.). Tra questi è presente anche il valore booleano "attivo".
    Tramite apposito codice vengono contati i record presenti nella tabella e viene scelto un numero casuale (random_call).
    Dal momento che il record selezionato potrebbe essere non attivo (ovvero attivo==FALSE) faccio una verifica (random_cd_check).
    Nel caso in cui l'esito sia positivo, si procede con l'esecuzione del codice, diversamente viene ripetuta la procedura dall'inizio.

    Questo il codice:

    Codice PHP:
        function random_call($db){
            
    $query_random_cd "SELECT * FROM compactdisc";
            
    $ris_random_cd mysql_query($query_random_cd,$db) or die("Errore nella query cd random: ".mysql_error());
            
    $number=mysql_num_rows($ris_random_cd);
            
    $rand_number mt_rand (1,$number);
            
    $numerello random_cd_check($rand_number,$db);
            echo 
    "numero fortunello funzione random ".$numerello."\n";
            return 
    $numerello;
            }
            
    //
        
    function random_cd_check($rand_number,$db){
            
    $query_check_random_cd "SELECT * FROM compactdisc WHERE compactdisc.id='$rand_number' AND compactdisc.attivo=TRUE";
            
    $ris_check_random_cd mysql_query($query_check_random_cd,$db) or die("Errore nella query check cd random: ".mysql_error());
            
    $check_random_cd_total=mysql_num_rows($ris_check_random_cd);
                if (
    $check_random_cd_total>=1){
                    echo 
    "cd attivo!\n";
                    echo 
    "numero fortunello funzione check ".$rand_number."\n";
                    return 
    $rand_number;
                }else{
                    echo 
    "cd non attivo!\n";
                    
    random_call($db);
                }
        }
        
    //
        
    $numerello random_call($db);
        echo 
    "numero fortunello ".$numerello."\n"
    Dopo una serie di modifiche e tentativi, ho dedotto che il problema risieda in queste righe:

    Codice PHP:
    $numerello random_cd_check($rand_number,$db);
    echo 
    "numero fortunello funzione random ".$numerello."\n";
    return 
    $numerello
    Questo echo, infatti, non visualizza solo $numerello ricevuto dalla chiamata della funzione random_cd_check (quindi quello corrispondente al record attivo) bensì viene ripetuto per ogni query effettuata, anche quelle che hanno avuto esito negativo.

    Se prima del record attivo ne sono stati selezionati casualmente 12 non attivi, il comando echo verrà ripetuto 12 volte anche se solo la prima visualizzazione avrà un valore (ovvero quello ricevuto dalla funzione random_cd_check) poichè gli echo vengono visualizzati in ordine inverso.
    Proprio per questo return $numerello non restituisce assolutamente nulla poichè darà l'esito della prima query (il cui esito, nei test che sto effettuando, è quasi sempre negativo poichè tra i record presenti solo uno è attivo, proprio per verificare l'efficienza del codice).


    Mi rendo conto di non aver esposto la faccenda nel più chiaro dei modi, mi auguro tuttavia qualcuno riesca a capirci qualcosa e sia in grado di darmi una mano.

    Grazie e buona serata.
    <-- Fare. O non fare. Non c'è provare. -->

    www.yodastudio.com
    segui YODA Studio su facebook

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Ho provato a seguire il ragionamento e non so se ci sono riuscito... puoi spiegare cosa vuoi ottenere? Non mi è del tutto chiaro perchè non imposti da subito nella query la condizione attivo=TRUE... in ogni caso la chiamata mutuamente ricorsiva non è il massimo... per stare allo schema che hai fatto potresti cambiare la funzione random_cd_check in modo da restituire semplicemente un valore booleano sostituendo l'intero blocco:

    Codice PHP:
    if ($check_random_cd_total>=1){
            echo 
    "cd attivo!\n";
            echo 
    "numero fortunello funzione check ".$rand_number."\n";
            return 
    $rand_number;
        }else{
            echo 
    "cd non attivo!\n";
            
    random_call($db);

    con

    Codice PHP:
    return ($check_random_cd_total>=1); 
    e cambiando nella prima funzione:

    Codice PHP:
    $rand_number mt_rand (1,$number);
    $numerello random_cd_check($rand_number,$db); 
    con:
    Codice PHP:
    $numerello false;
    while (!
    $numerello) {
        
    $rand_number mt_rand (1,$number);
        
    $numerello random_cd_check($rand_number,$db); 
    };
    $numerello $rand_number
    In sostanza: effettuare il controllo finchè l'esito non è positivo.

    NOTA: NON HO ricontrollato il codice... verifica sulla base dell'idea suggerita, comunque.

    ATTENZIONE: un ciclo come quello proposto - si fa spesso - in effetti non è per niente ottimizzato e potrebbe teoricamente essere indefinito...



    Se vuoi semplicemente ottenere la posizione di un record casuale con il campo attivo=true, puoi fare
    Codice PHP:
    SELECT FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY rand() LIMIT 1 
    e settare $numerello = $result['id'] (supponendo che $result contenga il record recuperato dalla query)

    una cosa strana in tutta la questione è che si suppone i record abbiano id numerico consecutivo... è così?

  3. #3
    Buongiorno.
    Innanzitutto grazie per l'aiuto.
    Allora, il mio intento è il seguente: visualizzare, in un apposito box presente nella pagina html, un CD (record della tabella) selezionato casualmente tra quelli attivi esistenti.
    Preciso che gli ID dei record sono tutti consecutivi.
    Detto questo, porto come esempio la situazione che ho impostato per fare i test: nella tabella sono presenti 14 record e solamente uno è attivo.
    Questa è una condizione inverosimile poichè è molto più probabile che si verifichi il contrario, ovvero 13 record attivo ed uno non attivo.
    Tuttavia, per adesso ho impostato tutto così per verificare i risultati dei test.
    Il valore che a me interessa per recuperare i dati del record selezionato è l'ID. Questo perchè esistono dei collegamenti con altre tabelle ed il riferimento rimane sempre l'ID del CD selezionato.
    Se utilizzassi il codice indicato (SELECT * FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY rand() LIMIT 1) otterrei un risultato non attendibile, e spiego subito il perchè:
    per come sono impostati adesso i record (13 non attivi, 1 attivo) otterrei come risultati della query "1", ma non è detto che il record attivo sia quella avente per ID "1", pertanto richiamerei molto probabilmente il record sbagliato (ovvero non attivo).
    Altrimenti, e qui mi servirebbe nuovamente aiuto, si dovrebbe scegliere casualmente un ID solamente tra quelli attivi (e non il numero, inteso come totale, dei record attivi come avviane attualmente).
    Quindi, per riportare brevemente quella che è la mia esigenza, ho bisogno di ottenere un ID casuale tra quelli dei record attivi.
    <-- Fare. O non fare. Non c'è provare. -->

    www.yodastudio.com
    segui YODA Studio su facebook

  4. #4
    Tutto risolto.

    Con il codice:
    Codice PHP:
        function random_call($db){
            
    $query_random_cd "SELECT * FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY rand() LIMIT 1";
            
    $ris_random_cd mysql_query($query_random_cd,$db) or die("Errore nella query cd random: ".mysql_error());        
            
    $number mysql_fetch_array($ris_random_cd);
            echo 
    "La casualità ha prodotto il seguente risultato: ".$number['id'];
            
    $selected_number $number['id'];
            return 
    $selected_number;
            } 
    seleziono casualmente un record tra quelli attivi, dopodichè ne estraggo l'ID, che è il valore che a me serve. In questo modo funziona anche in caso di ID non consecutivi, meglio di quanto sperassi.

    Grazie mille per l'aiuto.
    <-- Fare. O non fare. Non c'è provare. -->

    www.yodastudio.com
    segui YODA Studio su facebook

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.