Ci sono diverse imprecisioni nel codice che lo rendono difficile da leggere ed interpretare:
- 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
- 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()