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,954

    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(0, 20);

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