Pagina 1 di 1

estrazione dati random senza doppioni

Inviato: 06/11/2016, 12:11
da alex75
Buon giorno ragazzi!
Dopo 2 settimane di lavoro e grazie al Vostro aiuto stamattina il mio progetto ha finalmente preso vita :mrgreen:
eccolo: http://www.scambiobannergratis.it
Tornando in argomento...
Ho un problema con l'estrazione del banner. In fase di estrazione dal db uso:

Codice: Seleziona tutto

ORDER BY RAND() LIMIT 1";

Ma come potete ben vedere a fine pagina, aggiornando la stessa, capita che il banner si ripeta prima di aver visualizzato risultati diversi.
In pratica io vorrei che se avessi 100 banner ed il banner estratto attualmente fosse il 25°, lo stesso non debba essere mostrato nuovamente, prima dei restanti 99.
come posso aggiungere questo controllo?

Re: estrazione dati random senza doppioni

Inviato: 06/11/2016, 19:34
da Micogian
Potresti farlo creando un array casuale di 100 numeri.
Ad esempio

Codice: Seleziona tutto

// crea array casuale di 100 numeri
$array_banner = array('1','2','3','4','5', ....., '100');
shuffle($array_banner);
In questo modo hai un array casuale dal numero 1 al 100.
Crei un numeratore
$nn = 0;
in maniera di visualizzare il primo banner che è

$banner_cor = $array_banner[$nn] ;

Ad ogni visualizzazione il numeratore $nn aumenta di 1 e pertanto avrai la sequenza dei banner da visualizzare in base al valore $nn
Quando arrivi a 99 ripeti l'operazione random.

Re: estrazione dati random senza doppioni

Inviato: 06/11/2016, 20:08
da alex75
Il numero 100 è ipotetico ma in realtà è in continuo aumento (praticamente ogni nuovo iscritto ne aggiungerà 1 suo) ed è quindi importante che nessun banner venga escluso oltre che non venga visualizzato più di altri.
Che sia in ordine alfabetico o numerico non ha importanza purchè sia equo per tutti.

Re: estrazione dati random senza doppioni

Inviato: 06/11/2016, 20:35
da Micogian
Tutti i banner li metti in una tabella e richiami una lista random di tutti e li fai visualizzare in ordine.
Avrai un banner_id e il nome del banner per visualizzarlo.

Re: estrazione dati random senza doppioni

Inviato: 07/11/2016, 0:18
da alex75
Risolto!
ho avuto un'idea un pò meccanica e fin troppo efficiente :-)
ho aggiunto una tabella "id_rand" con valore 1 e 2 (predefinito 1) praticamente tinyint si/no; sotto la tabella user_id.
Nella "SELECT" ho aggiunto WHERE id_rand = 1
ad ogni estrazione porto il valore di id_rand per quell'user_id a 2, così non verrà nuovamente estratto.
Fin qui tutto funziona alla grande nessun duplicato al 100% (anzi posso anche fare a meno di 'order by rand' ).
Ma ovviamente appena avrò assegnato il valore 2 a tutti gli user_id , non verrà estratto più nulla (ecco perchè dicevo fin troppo efficiente :D ).
A questo punto decido di usare "order by user_id DESC limit 1;
Questo perchè non so quale sia l'ultimo id ma so che il primo è il numero 1 ;-)
Quindi quando avrò raggiunto l'ultimo id riporterò tutte le tabelle id_rand a valore 1 (nuovamente disponibili) così:

Codice: Seleziona tutto

$req = mysqli_query($dbi, "UPDATE `phpbb_users` SET id_rand = 1 WHERE user_id > 1 AND '$id' = 2; ");
Ecco una sintesi del codice (ho cancellato quello che non aveva a che fare con questo topic)

Codice: Seleziona tutto

<?php
if (!defined('IN_PHPBB'))
{
exit;
}
$sql = "SELECT ut.user_id, ut.id_rand, pt.user_id, pt.pf_phpbb_website
FROM " . USERS_TABLE . " ut, " . PROFILE_FIELDS_DATA_TABLE . " pt 
WHERE pt.pf_phpbb_website IS NOT NULL
AND ut.id_rand = 1
AND ut.user_id = pt.user_id 
ORDER BY ut.user_id DESC LIMIT 1";
        
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('lista_banner',array(
'USER_COR'    => $row['user_id'],
$id = $row['user_id']
));
}
// Mi connetto al database mysql
$dbi = mysqli_connect("localhost", 'root', '', 'sbg');
// porto il valore della tabella id_rand a 2 così non potrà essere usata nuovamente prima delle altre
$req = mysqli_query($dbi, "UPDATE `phpbb_users` SET id_rand = 2 WHERE user_id = '$id'; ");
// porto il valore della tabella id_rand a 1 così potrà essere usata nuovamente 
$req1 = mysqli_query($dbi, "UPDATE `phpbb_users` SET id_rand = 1 WHERE user_id > 1 AND '$id' = 2; ");
?>

Re: estrazione dati random senza doppioni

Inviato: 07/11/2016, 14:41
da alex75
Ho testato in locale fino ad ora e tutto funziona regolarmente. Se volete provarlo adesso lo vedrete online...