phpBB Italia chiude!
phpBB Italia ringrazia tutti gli utenti che hanno dato fiducia al nostro progetto per ben 9 anni, e che, grazie al grande lavoro fatto da tutto lo Staff (rigorosamente a titolo gratuito), hanno portato il portale a diventare il principale punto di riferimento italiano alla piattaforma phpBB.

Purtroppo, causa motivi personali, non ho più modo di gestirlo e portarlo avanti. Il forum viene ora posto in uno stato di sola lettura, nonché un archivio storico per permettere a chiunque di fruire di tutte le discussioni trattate.

Il nuovo portale di assistenza per l'Italia di phpBB diventa phpBB-Store.it, cui ringrazio per aver deciso di portare avanti questo grande progetto.

Grazie ancora,
Carlo - Amministratore di phpBB Italia

estrazione dati random senza doppioni

Area di discussione relativa al linguaggio di programmazione web più conosciuto. Il forum è dedicato anche a MySQL, la piattaforma di database più utilizzata con il PHP.
Rispondi
Avatar utente
alex75
phpBB Expert
phpBB Expert
Messaggi: 943
Iscritto il: 31/03/2012, 23:46
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.37
Database: MySQL 5.6.39
Località: palermo
Contatta:

estrazione dati random senza doppioni

Messaggio da alex75 » 06/11/2016, 12:11

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?

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: estrazione dati random senza doppioni

Messaggio da Micogian » 06/11/2016, 19:34

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.

Avatar utente
alex75
phpBB Expert
phpBB Expert
Messaggi: 943
Iscritto il: 31/03/2012, 23:46
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.37
Database: MySQL 5.6.39
Località: palermo
Contatta:

Re: estrazione dati random senza doppioni

Messaggio da alex75 » 06/11/2016, 20:08

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.

Avatar utente
Micogian
Leader Programmatori
Leader Programmatori
Messaggi: 3704
Iscritto il: 07/01/2010, 8:51
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.4.36
Database: MySQL 5.1.70-log
Località: Udine
Contatta:

Re: estrazione dati random senza doppioni

Messaggio da Micogian » 06/11/2016, 20:35

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.

Avatar utente
alex75
phpBB Expert
phpBB Expert
Messaggi: 943
Iscritto il: 31/03/2012, 23:46
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.37
Database: MySQL 5.6.39
Località: palermo
Contatta:

Re: estrazione dati random senza doppioni

Messaggio da alex75 » 07/11/2016, 0:18

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; ");
?>

Avatar utente
alex75
phpBB Expert
phpBB Expert
Messaggi: 943
Iscritto il: 31/03/2012, 23:46
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.37
Database: MySQL 5.6.39
Località: palermo
Contatta:

Re: estrazione dati random senza doppioni

Messaggio da alex75 » 07/11/2016, 14:41

Ho testato in locale fino ad ora e tutto funziona regolarmente. Se volete provarlo adesso lo vedrete online...

Rispondi

Torna a “PHP - MySQL”

Chi c’è in linea

Visitano il forum: Nessuno e 41 ospiti