Visualizzazione risultati 1 fino 2 di 2
Like Tree2Likes
  • 2 Post By mzanella

Discussione: Scelta random in DB MySQL fra sole righe di un certo range

  1. #1
    jarmania non è connesso Neofita
    Data registrazione
    21-03-2009
    Messaggi
    14

    Predefinito Scelta random in DB MySQL fra sole righe di un certo range

    Salve a tutti!
    E da un pò che sono bloccato nel scegliere un vincitore casuale da una tabella mysql, ovvero ci sono quasi riuscito solo che l'ID che mi riporta alla fine non è affatto corretto, non dovrebbe vincere.

    Vi mostro il codice così è più probabile che capite di cosa stia parlando:
    Codice PHP:
    <?
    function aggiornaVincitore($categoria,$punteggio)
    {
        
    $minimo $punteggio;
        
    $maxx $minimo 20
        
    $max mt_rand($minimo,$maxx); //Massimo punt. per scelta vincitore
        
    echo "MINIMO: ".$minimo." MASSIMO: ".$max."<br />";
        
    $query mysql_query("select * from giocatori".$categoria." WHERE percentuale BETWEEN ".$minimo." AND $max")or die("ERRORE QUERY: ".mysql_error()."");
        while(
    $row mysql_fetch_array($query)){ 
            echo 
    "Ho trovato ID "$row['id'] ." giocatore con percentuale ".$row['percentuale']." <br />"
            
    $possibilivincitori++; //Conto tutti i possibili vincitori della ricerca in un unica variabile
        
    }
        
    $scelta rand(1$possibilivincitori);//MINIMO 1 
        
    echo "Ci sono in totale ".$possibilivincitori." vincitori possibili.<br />"
        
    $seleziono mysql_query("SELECT * FROM giocatori".$categoria." WHERE id = ".$scelta."")or die("ERRORE QUERY: ".mysql_error()."");
        
    $colonna mysql_fetch_array($seleziono);
        echo 
    "$possibilivincitori in totale tra $minimo e $max ho scelto IL GIOCATORE = ".$scelta." ID ".$colonna['id']." che ha vinto con il punteggio di ".$colonna['percentuale']." <br />";
    }

    aggiornaVincitore("Terra",50);
    ?>

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,172

    Predefinito

    Ci sono diverse imprecisioni nel codice che lo rendono difficile da leggere ed interpretare:
    1. i nomi degli identificatori: la funzione aggiornaVincitore non aggiorna nessun vincitore, si limita ad estrarne uno casualmente e stamparne l'ID, chiami $query e $seleziono delle variabili che rappresentano dei record set, chiami $colonna una variabile che rappresenta una riga... insomma, consiglio un refactoring
    2. usi le funzioni mysql_* che sono deprecate ed andrebbero sostituite con mysqli o PDO


    Ciò detto, l'errore principale probabilmente è:
    Codice PHP:
    $scelta rand(1$possibilivincitori);
    $seleziono mysql_query("SELECT * FROM giocatori".$categoria." WHERE id = ".$scelta."") [...] 
    così facendo, in $scelta, ha un numero compreso fra 1 ed il numero di partecipanti con il punteggio compreso tra gli estremi indicati, un valore ben diverso dall'ID che usi come clausola per la SELECT.

    Per fare un esempio concreto, supponiamo che i giocatori idonei all'estrazione abbiano ID: 100, 101, 102, 103.
    In questo caso $possibilivincitori = 4, dunque $scelta è un intero casuale tra 1 e 4 (inclusi), supponiamo valga 2 a titolo di esempio.
    Con la SELECT da te usata, il testo della query diventa SELECT ... WHERE id=2, che non è il risultato corretto.

    Il modo più rapido per risolvere è mantenere traccia, in un vettore, degli ID dei giocatori idonei, in modo da potervi accedere per recuperarli:
    Codice PHP:
    $ids = [];
    $i 0;
    while (
    $row mysql_fetch_array($query)) {
        echo 
    "Ho trovato ID " $row['id'] . " giocatore con percentuale " $row['percentuale'] . " <br />";  
        
    $ids[$i++] = $row['id'];
    }
    $possibilivincitori count($ids);
    $scelta $ids[rand(1$possibilivincitori)]; 
    MA ti suggerisco piuttosto di ripensare il codice. Se hai semplicemente bisogno di estrarre una riga casuale da una tabella (con il vincolo min <= punteggio <= max) ci sono modi molto più semplici, efficienti ed adatti:
    Codice PHP:
    <? 
    function aggiornaVincitore($categoria$punteggio_minimo)
    {
        
    $punteggio_massimo $punteggio_minimo mt_rand(020);

        
    $query "SELECT * FROM giocatori" $categoria
               
    " WHERE percentuale BETWEEN " $punteggio_minimo " AND " $punteggio_massimo
               
    " ORDER BY RAND() LIMIT 1";
        
    $result mysql_query($query) or die("ERRORE QUERY: " mysql_error());

        
    $row mysql_fetch_array($result);
        if (!
    $row) {
            
    // Nessun giocatore idoneo, devi gestire questo caso
        
    }
        else {
            echo 
    "Punteggi tra: $punteggio_minimo e $punteggio_massimo, ";
            echo 
    "ho scelto il giocatore con ID: " $row['id'] . ", con punteggio: " $row['percentuale'] . "<br/>";
        }
    }
    ?>
    Se hai bisogno anche del numero di giocatori il cui punteggio rientra nell'intervallo indicato, ti basta rimuovere LIMIT 1 dalla query e selezionare anche COUNT(id):
    Codice:
    SLECT *, COUNT(id) FROM ... ORDER BY RAND()
    alemoppo and darbula like this.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •