[PHP] Struttura Database di statistica

  • Creatore Discussione Creatore Discussione Rey
  • Data di inizio Data di inizio

Rey

Utente Attivo
11 Set 2012
73
0
6
Salve a tutti,
ho scritto un programma in un router che ogni giorno genera un file txt con l'hostname, le ultime cifre l'ip. i mb scaricati, uplodati e totali, una cosa così:

HTML:
iPad-di-Mario,254,100,100,200
android-432133,253,50,50,10
etc...
Poi con google chart genero il grafico

PHP:
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['IP', 'DL', 'UP', 'TOT'],
          <?php
          $file = file("stats--20170315.txt");
          foreach ($file as $line) { list($ip,$dl,$up,$tot, ) = explode(",",trim($line));
          echo "['$ip | $tot MB', $dl, $up, $tot],\n";
        }
        ?>
        ]);

Invece che visualizzarli così al volo vorrei importarli in un db mysql per generare statistiche settimanali/mensili oltre che giornaliere ma non so bene come strutturare il db, gli ip sono da 100 a 254 quindi in totale 154 colonne? Avevo in mente di creare una tabella con 365 righe (una per giorno) e 154 colonne (una per ip), probabilmente si può fare meglio.. Sapete darmi qualche dritta? Grazie..

Qui un po' di codice:

PHP:
// Se il database è vuoto
$tabella = $prefixdb . 'anno' . $anno;
$sql = "SELECT data FROM $tabella WHERE id_anno = ?";
$data = $db->Query_select($sql, array(1)); 
if (!count($data)) {

// Se l'anno è bisestile
if ($bisestile == 1) {

// Inserisco le date
for ($giorni = 1; $giorni <= 31; $giorni++) {
for ($mesi = 1; $mesi <= 12; $mesi++) {

if ($mesi == 2 && $giorni == 30 ||
$mesi == 2 && $giorni == 31 ||
$mesi == 4 && $giorni == 31 ||
$mesi == 6 && $giorni == 31 ||
$mesi == 9 && $giorni == 31 ||
$mesi == 11 && $giorni == 31) { continue; }

$aammgg = $anno . '-' . $mesi . '-' . $giorni;
$sql = "INSERT INTO $tabella (data,mese) VALUES(?,?)";
$data = $db->Query_InsUpd($sql, array($aammgg,$mesi));
}
}
etc...
 
ciao
da quello che ho capito tu vuoi crere delle statisti di visita al tuo sito, giusto?
prima di mettere giu il codice è importante definire la struttura del db (carta e matita) definendo quali dati servono e a cosa poi devono servire.
ti faccio un esempio:
se vuoi sapere quante visite ha fatto un determinato ip al tuo sito semplicemente così senza sapere le date ti basta uan tabella del tipo
IP (chiave primaria)
num_visite
e con la INSERT ... ON DUPLICATE KEY UPDATE risolvi subito
se al contrerio vuoi fare delle statistiche più complesse allora la tabella diventa più complessa (e di conseguenza le query)
es se vuoi dividere per data la tabella potrebbe essere
id (chiave primaria)
IP
data_visita
ricorda comunque che mentre lo script è semplice da aggiornare, aggiornare le tabelle (es aggiungere un campo) e un po più rognoso soprattutto se la tabella è gia molto usata
 
Ciao borgo,
forse la mia spiegazione sul cos'è è stata un po' troppo sintetica, provo a spiegarmi meglio, non ha niente a che fare con le visite a un sito, immagina di connettere il tuo cellulare o PC in wifi in un hotel e navigare su youtube, facebook etc.. al tuo cellulare verrà assegnato un ip casuale che va da 100 a 254 ed avrà validità 24h. Una volta al giorno il mio programma scrive in un txt i dati sul traffico generato da ogni dispositivo (c'è l'esempio nel mio post precedente) e resetta i contatori, stop. Ora pescando i dati dal txt vedo statistiche giornaliere, vorrei averle anche settimanali/mensili.
 
Nessuno sa darmi qualche dritta? Penso farò tutto in un'unica tabella, Una riga per giorno e una colonna per utente.. 154 colonne in una tabella sono troppe?
 
ciao
sempre che non abbia capito male io farei una tabella del tipo chiamata es statistiche
Codice:
id
data
ip
tot_mb
dl
up
tot
poi leggi il tuo file txt
PHP:
//dati connessione
$file = file("stats--20170315.txt");
foreach ($file as $line) { list($ip,$dl,$up,$tot, ) = explode(",",trim($line));
           echo "['$ip | $tot MB', $dl, $up, $tot],\n";
           $data_lettura_txt=date("y/m/d");//data in cui leggi il file
           $query="INSERT INTO statistiche(data,ip,tot_mb,dl,up,tot) VALUE('$data_lettura_tx','$ip','$tot','$dl','$up','tot')";
           //al posto di $data_lettura_tx puoi metter now() o usare il timestamp $data_lettura_txt=time(); vedi tu
           $ris=mysqli_query($conn, $query);
}
//....
da una tabella fatta così puoi ricavare tutte le statistiche che ti servono (giornaliere, mensili, annuali, quanto scaricato....) interrogandola in varie maniere

spero di non aver capito male
 

Discussioni simili