[PHP] Estrazione random con nomi presi dal db

Discussione in 'PHP' iniziata da Max61, 17 Settembre 2019.

  1. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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
     
  2. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    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));
     
  3. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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` (
      `
    idint(11NOT NULL,
      `
    Rilevatorevarchar(100CHARACTER SET utf8 NOT NULL,
      `
    Indirizzovarchar(100NOT NULL,
      `
    Mailvarchar(255NOT NULL,
      `
    Telefonovarchar(50NOT NULL,
      `
    Cellularevarchar(50NOT NULL,
      `
    Cellulare2varchar(50NOT NULL,
      `
    tipovarchar(255NOT NULL,
      `
    statovarchar(255NOT NULL,
      `
    tipoincaricovarchar(255NOT NULL,
      `
    deter_incaricovarchar(255NOT NULL,
      `
    fam_ass_citta_aint(11NOT NULL,
      `
    fam_int_citta_aint(11NOT NULL,
      `
    percen_citta_avarchar(5NOT NULL,
      `
    fam_ass_fraz_aint(11NOT NULL,
      `
    fam_int_fraz_aint(11NOT NULL,
      `
    percen_fraz_avarchar(5NOT NULL,
      `
    fam_ass_camp_aint(11NOT NULL,
      `
    fam_int_camp_aint(11NOT NULL,
      `
    percen_camp_avarchar(5NOT NULL,
      `
    tot_fam_ass_aint(11NOT NULL,
      `
    tot_fam_int_aint(11NOT NULL,
      `
    tot_perc_avarchar(5NOT NULL,
      `
    fam_ass_listaint(11NOT NULL,
      `
    fam_int_listaint(11NOT NULL,
      `
    percen_listavarchar(4NOT NULL,
      `
    fam_ass_totint(11NOT NULL,
      `
    fam_int_totint(11NOT NULL,
      `
    percen_totvarchar(5NOT NULL,
      `
    Annovarchar(4NOT NULL,
      `
    linkcartellavarchar(255NOT 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 `idint(11NOT 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?
     
  4. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    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!
     
  5. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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)
     
  6. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    IT/SW
    No ID ma id
     
  7. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Stesso errore sempre nella quart'ultima riga
    $ind = indiceCasuale ($tn, $in);
     
    Ultima modifica: 17 Settembre 2019
  8. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    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.....
     
  9. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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
     
  10. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    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;
     
  11. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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]
     
  12. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    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!
     
  13. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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
     
  14. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    Adesso ho risolto la randomizzazione togliendo id tra parentesi
    ORDER BY RAND(id)
    ORDER BY RAND()
     
  15. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    IT/SW
    Scusa un refuso da framework, togli id da RAND...
    PHP:
    SELECT Rilevatore FROM `tblrilevatoriWHERE Anno 2019 AND stato 'Incarico accettato' ORDER BY RAND()
    Per il numero progressivo basta stampare $k+1!
     
  16. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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.
     
  17. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    IT/SW
    PHP:
    foreach($result as $k=>$v){
    echo 
    'Sezione '.($k+1).': '.$v.'<br>';
    }
     
  18. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    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>';
     
  19. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    967
    Mi Piace Ricevuti:
    56
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    IT/SW
    Proprio proprio copia/incolla....
    PHP:
    $v['Rilevatore']
     
  20. Max61

    Max61 Utente Attivo

    Registrato:
    2 Marzo 2014
    Messaggi:
    615
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    ;)Vero hai ragione...
    GRAZIE INFINITE
     
Sto caricando...

Condividi questa Pagina