Chiamata multipla di query

di il
4 risposte

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:

	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:

$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.

4 Risposte

  • Re: Chiamata multipla di query

    Non ho ben capito se tu intenda pescare dal database una riga a caso che abbia l'attributo "attivo" positivo, nel qual caso basterebbe usare la query seguente, che prende una riga a caso dalla tabella compactdisc, scegliendo fra quelle con "attivo" positivo:
    SELECT * FROM compactdisc WHERE attivo = TRUE ORDER BY RAND() LIMIT 1;
    Mentre, nel caso si vogliano mostrare casualmente ad uno ad uno tanti risultati finchè non ne esca uno con "attivo" positivo (es. FALSE FALSE TRUE stop) allora si potrebbe riempire un array con tutte le righe della tabella (oppure un certo numero di righe, unendo il codice seguente alla sintassi SQL precedentemente citata) e poi lavorare sull'array con PHP, per esempio (tenendo come esempio una tabella "compactdisc" dai campi "id", "title", "artist" e "attivo":
    <?php
    function data_call () {
    	global $db;
    	$query = mysql_query ("SELECT * FROM compactdisc", $db) or die (mysql_error ());
    	while ($rs = mysql_fetch_object ($query)) $cd [] = $rs;
    	shuffle ($cd);
    	return $cd;
    }
    
    function print_l ($line) {
    	echo "<p><strong>{$line->artist}</strong><br />\n";
    	echo "{$line->title}<br />";
    	$attivo = $line->attivo ? "attivo" : "non attivo";
    	echo "<em>CD $attivo!</em></p>\n";
    }
    
    foreach (data_call () as $line) {
    	print_l ($line);
    	if ($line->attivo) break;
    }
    ?>
    Sappimi dire se una di queste soluzioni ti soddisfa o se ti servono altre o diverse delucidazioni.
  • Re: Chiamata multipla di query

    La mia intenzione è proprio quella di ottenere casualmente un recordo tra quelli attivi, quindi il primo codice da te indicato fa al caso mio.

    Così funziona perfettamente:
    function random_call($db){
            $query_random_cd = "SELECT * FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY rand()";
            $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;
            }
    In questo modo recupero l'ID del record attivo al fine di utilizzarlo per lo scopo desiderato.

    Mi diletto con PHP e MYSQL solo da qualche settimana ed ho ancora parecchio da imparare.
    Grazie mille per l'aiuto.
  • Re: Chiamata multipla di query

    Di nulla!

    Comunque, nel caso ti serva un solo record, ti conviene tenere alla fine della stringa SQL il termine LIMIT 1, così da limitarne l'estrazione ad una sola riga al massimo, tanto ci ha già pensato ORDER BY RAND() a fare il mescolamento!

    Inoltre ti consiglio di fare il test seguente, in quanto può darsi che l'ID del record estratto si trovi ad un livello più profondo dell'array intero:
    <?php
    // Test dell'array associativo
    $numerello = mysql_fetch_array ($query);
    print_r ($numerello);
    ?>
    Stavolta non ho fatto test, ma a colpo d'occhio mi pare che mysql_fetch_array restituisca una collezione multidimensionale, tale che forse non basta $numerello['id'] ma piuttosto $numerello[0]['id'].

    Ciao!
  • Re: Chiamata multipla di query

    LIMIT 1 l'ho in effetti aggiunto, solo che il codice che ho riportato prima non era ancora quello definitivo.
    Per il resto, $numerello['id'] funziona perfettamente, quindi posso ritenermi soddistaffo del risultato.

    Grazie ancora e buona serata.
Devi accedere o registrarti per scrivere nel forum
4 risposte