[PHP] Estrazione random con nomi presi dal db

Max61

Utente Attivo
2 Mar 2014
616
3
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
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));
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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?
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
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!
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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)
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
Stesso errore sempre nella quart'ultima riga
$ind = indiceCasuale ($tn, $in);
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
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.....
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
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;
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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]
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
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!
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
Adesso ho risolto la randomizzazione togliendo id tra parentesi
ORDER BY RAND(id)
ORDER BY RAND()
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
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!
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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.
 

Max61

Utente Attivo
2 Mar 2014
616
3
18
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>';