[PHP] Estrazione random con nomi presi dal db

Max61

Utente Attivo
2 Mar 2014
760
4
18
Salve, eccomi di nuovo a chiedere aiuto al forum.
Grazie all'aiuto del forum ho fatto una pagina per l'estrazione casuale di persone, funziona perfettamente, ma vorrei migliorarlo, mi spiego:
adesso scrivo i nomi delle persone all'interno della pagina php, invece sarebbe più funzionale che li prendesse direttamente dal db...qualcuno sa aiutarmi?
Allego codice
PHP:
$Rilevatori = array("Virginia","Riccardo","Antonella","Susanna","Antonio",
"Melania","Giuliana","Gloria","Stefania","Fabio","Giulia","Claudio","Carmela","Pier Paolo","Giovanni",
"Francesco","Tiziana");

$indici = array();
$Rilevatori_estratti = array();

$numero_Rilevatori = 17; // Rilevatori da estrarre dall'array
$tot_Rilevatori = count($Rilevatori) - 1; // numero totale dei Rilevatori nell'array

for ( $i = 0; $i < $numero_Rilevatori; $i++ ) {
  $ind = indiceCasuale($tot_Rilevatori, $indici);
  $indici[] = $ind;
  $Rilevatori_estratti[$i+1] = $Rilevatori[$ind];
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    $ind = indiceCasuale ($tn, $in);
  }
    return $ind;
}
Grazie
Max61
 
Il modello "Rilevatori" prevede il nome o una referenza da utilizzare come tale?
Il DB è stato strutturato come.....????


Quanto da te scritto poteva essere riassunto in questo modo:
PHP:
$Rilevatori = array("Virginia","Riccardo","Antonella","Susanna","Antonio",
"Melania","Giuliana","Gloria","Stefania","Fabio","Giulia","Claudio","Carmela","Pier Paolo","Giovanni",
"Francesco","Tiziana");
$MaxNum=5;
$Rilevatori_estratti=$Rilevatori;
shuffle($Rilevatori_estratti);
print_r(array_slice($Rilevatori_estratti,0,$MaxNum));
 
Ciao Macus_adi e grazie, questa è la struttura della tabella
PHP:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Struttura della tabella `tblrilevatori`
--

CREATE TABLE `tblrilevatori` (
  `id` int(11) NOT NULL,
  `Rilevatore` varchar(100) CHARACTER SET utf8 NOT NULL,
  `Indirizzo` varchar(100) NOT NULL,
  `Mail` varchar(255) NOT NULL,
  `Telefono` varchar(50) NOT NULL,
  `Cellulare` varchar(50) NOT NULL,
  `Cellulare2` varchar(50) NOT NULL,
  `tipo` varchar(255) NOT NULL,
  `stato` varchar(255) NOT NULL,
  `tipoincarico` varchar(255) NOT NULL,
  `deter_incarico` varchar(255) NOT NULL,
  `fam_ass_citta_a` int(11) NOT NULL,
  `fam_int_citta_a` int(11) NOT NULL,
  `percen_citta_a` varchar(5) NOT NULL,
  `fam_ass_fraz_a` int(11) NOT NULL,
  `fam_int_fraz_a` int(11) NOT NULL,
  `percen_fraz_a` varchar(5) NOT NULL,
  `fam_ass_camp_a` int(11) NOT NULL,
  `fam_int_camp_a` int(11) NOT NULL,
  `percen_camp_a` varchar(5) NOT NULL,
  `tot_fam_ass_a` int(11) NOT NULL,
  `tot_fam_int_a` int(11) NOT NULL,
  `tot_perc_a` varchar(5) NOT NULL,
  `fam_ass_lista` int(11) NOT NULL,
  `fam_int_lista` int(11) NOT NULL,
  `percen_lista` varchar(4) NOT NULL,
  `fam_ass_tot` int(11) NOT NULL,
  `fam_int_tot` int(11) NOT NULL,
  `percen_tot` varchar(5) NOT NULL,
  `Anno` varchar(4) NOT NULL,
  `linkcartella` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indici per le tabelle scaricate
--

--
-- Indici per le tabelle `tblrilevatori`
--
ALTER TABLE `tblrilevatori`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT per le tabelle scaricate
--

--
-- AUTO_INCREMENT per la tabella `tblrilevatori`
--
ALTER TABLE `tblrilevatori`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
ti basta o serve dell'altro?
 
Quindi se la tua tabellaè questa, tutto il codice sopra lo potresti rimpiazzare con questo
Codice:
SELECT * FROM TABLE WHERE "LE TUE CLAUSOLOE" ORDER BY RAND(id)
Una banale query....
Buon lavoro!
 
Grazie, ma al solito a me non funziona, mi da errore, ecco la query
PHP:
$Rilevatori = mysql_query("SELECT * FROM tblrilevatori ORDER BY RAND(ID)")
or die(mysql_error());
$row = mysql_fetch_array($Rilevatori);


$indici = array();
$Rilevatori_estratti = array();

$numero_Rilevatori = 17; // Rilevatori da estrarre dall'array
$tot_Rilevatori = count($Rilevatori) - 1; // numero totale dei Rilevatori nell'array

for ( $i = 0; $i < $numero_Rilevatori; $i++ ) {
  $ind = indiceCasuale($tot_Rilevatori, $indici);
  $indici[] = $ind;
  $Rilevatori_estratti[$i+1] = $Rilevatori[$ind];
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    $ind = indiceCasuale ($tn, $in);
  }
    return $ind;
}
ecco l'errore
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65488 bytes)
 
Stesso errore sempre nella quart'ultima riga
$ind = indiceCasuale ($tn, $in);
 
Ultima modifica:
Non capisco....
PHP:
$conn=new mysqli('','','','');
$result=$conn->query('SELECT BLA BLA BLA')->fetch_all(MYSQLI_ASSOC);
A che ti serve indiceCasuale ????? non ha senso.....
 
Ciao, ho provato ma a me non funziona.
Allego codice completo
PHP:
$Rilevatori = mysql_query("SELECT * FROM tblrilevatori ORDER BY RAND(id)")
or die(mysql_error());
$row = mysql_fetch_array($Rilevatori);


$indici = array();
$Rilevatori_estratti = array();

$numero_Rilevatori = 17; // Rilevatori da estrarre dall'array
$tot_Rilevatori = count($Rilevatori) - 1; // numero totale dei Rilevatori nell'array

for ( $i = 0; $i < $numero_Rilevatori; $i++ ) {
  $ind = indiceCasuale($tot_Rilevatori, $indici);
  $indici[] = $ind;
  $Rilevatori_estratti[$i+1] = $Rilevatori[$ind];
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    //$ind = indiceCasuale ($tn, $in);
  }
    return $ind;
}
QUI RECUPERO I DATI:      
echo '<table>';
foreach($Rilevatori_estratti as $zona=>$rilevatore)echo '<tr><td>Sezione '.$zona. ': </td><td>' .$rilevatore.'</td></tr>';
echo '</table>';
echo "<center><span style=\"color:black; font-size: 12pt\"><span style=\"color:red height:1;width:1; background-color:white\">&nbsp;____________________&nbsp;<br></span></i><br><br><br>";
Ciao
Max61
 
Ciao @Max61,

la query dovrebbe essere di questo tipo:
Codice:
SELECT *
FROM `tblrilevatori`
ORDER BY RAND(id)
 LIMIT 15
Dove il limite 15 l'ho imposto io, da qui tutto ciò che devi fare è semplicemente utilizzare il ciclo per l'array di obj che hai dall'esecuzione della query....
Tutto il tuo codice sopra serve a ben poco...

Testato e funzionante:
PHP:
$conn=new mysqli('localhost','user','pass','dbconn');
$result=$conn->query('SELECT * FROM `tblrilevatori` ORDER BY RAND(id) LIMIT 5')->fetch_all(MYSQLI_ASSOC);
$my_table='<table><thead><tr>';
$keys=array_keys($result[0]);
foreach ($keys as $items){
   $my_table.='<th>'.$items.'</th>';
}
$my_table.='</tr></thead><tbody>';
foreach ($result as $k=>$v){
   $my_table.='<tr>';
   foreach ($keys as $items){
      $my_table.='<td>'.$v[$items].'</td>';
   }
   $my_table.='</tr>';
}
$my_table.='</tbody></table>';
echo $my_table;
 
Ciao ti posto l'errore che mi da
Fatal error: Call to a member function fetch_all() on boolean in C:\xampp\htdocs\censimento_permanente\views\estrazione.php on line 132
è in questa riga
PHP:
$result=$conn->query('SELECT * FROM `tblrilevatori` ORDER BY RAND(id) LIMIT 5')->fetch_all(MYSQLI_ASSOC);[/PHP[B]]
[/B]
 
Scusa ma $conn come l'hai settata?
dall'errore sembrerebbe tu non abbia settato il database....
PHP:
$conn=new mysqli('NOME_HOST','UTENTE','PASSWORD','NOME_DATABASE');
I parametri sono obbligatori!
 
OK, fatto, mi fa l'estrazione dei nomi però non cambia mai l'ordine, ma è sempre il solito
allego query
PHP:
$result=$conn->query("SELECT Rilevatore FROM `tblrilevatori` WHERE Anno = 2019 AND stato = 'Incarico accettato' ORDER BY RAND(id)")->fetch_all(MYSQLI_ASSOC);
$my_table='<table><thead><tr>';
$keys=array_keys($result[0]);
foreach ($keys as $items){
   
   $my_table.='<th>'.$items.'</th>';
}
$my_table.='</tr></thead><tbody>';

foreach ($result as $k=>$v){
   $my_table.='<tr>';
   foreach ($keys as $items){
      $my_table.='<td>'.$v[$items].'</td>';
   }
   $my_table.='</tr>';
}
$my_table.='</tbody></table>';
echo "<center><span style=\"color:black; font-size: 12pt\"><span style=\"color:red height:1;width:1; background-color:white\">&nbsp;____________________&nbsp;<br></span><br>";          
echo $my_table;
inoltre a questo punto mi servirebbe visualizzare un numero progressivo che parte da 1 a fino all'ultimo nome
es.: 10 nomi, numeri da 1 a 10
1: Virginia
2: Riccardo
3: Antonella
4: Susanna
5: Antonio
ecc.
il vecchio codice me lo permetteva
grazie del tempo che mi stai dedicando
Max61
 
Adesso ho risolto la randomizzazione togliendo id tra parentesi
ORDER BY RAND(id)
ORDER BY RAND()
 
Scusa un refuso da framework, togli id da RAND...
PHP:
SELECT Rilevatore FROM `tblrilevatori` WHERE Anno = 2019 AND stato = 'Incarico accettato' ORDER BY RAND()

Per il numero progressivo basta stampare $k+1!
 
Ovviamente non mi riesce farlo come era visualizzato a video con il codice che avevo prima
io vorrei un elenco tipo questo
Sezione 1: Antonio
Sezione 2: Francesco
Sezione 3: Susanna
ecc.
 
Provato, mi da questo errore per tutti i record estratti
Notice: Array to string conversion in C:\xampp\htdocs\rilevazione\views\estrazione_NEW.php on line 87
Sezione 1: Array
la riga è questa
echo 'Sezione '.($k+1).': '.$v.'<br>';
 

Discussioni simili