Downloads zählen und Tabelle mit meiste am Tag, in der Woche und im Jahr machen

Herror

Mitglied
Hallo,

stehe gerade vor dem Problem, dass ich gerne eine Statistik anlegen möchte wie oft eine Datei heruntergeladen wird und anschließend möchte ich Charts anzeigen lassen mit den meisten Downloads am Tag, in der Woche, im Monat, im Jahr und Alltime-Best.

Nun sehe ich mich vor dem Problem welche Tabellen ich in der Datenbank anlegen soll und wann ich wo was eintragen lassen soll... wie solle ich die Downloads am Tag, Monat, Jahr voneinander trennen, so dass man sie abrufen kann?

Also, dass ich 365 neue Zeilen pro Download mache schließt sich aus.
Aber hat jemand einen Tip oder ein Tutorial, wie man solch eine Statistik erstellen kann?

Programmieren kann ich das auch selber, habe einfach nur keine Idee, wie ich anfangen soll irgendwie....
 
Würde ich jeweils eine Tabelle für machen:

Dateien: DateiID, Pfad, Name

Tagesdownload: DateiID, TagesAnzahl

Monatsdownload: DateiID, MonatsAnzahl

Jahresdownload: DateiID, JahresAnzahl

Und dazu drei Cronjobs:
  • Zurücksetzen der Tagestabelle auf 0 um 0 Uhr täglich
  • Zurücksetzen der Monatstabelleauf 0 um 0 Uhr monatlich
  • Zurücksetzen der Jahrestabelle auf 0 um 0 Uhr jährlich

Die Struktur ist sehr grob aber genügt.
 
Zuletzt bearbeitet:
Hi,

ich würde zusätzlich zur Tabelle Dateien nur eine weitere Tabelle anlegen, die die Datei-Id und einen Timestamp aufnimmt. Da kommen dann zwar etwas mehr Daten zusammen, aber es ist flexibler.

LG
 
Jop, das ist der übliche Weg. Viel besser und kann man schon ne Ecke mehr mit Anfangen.
Heute hab ich mal wieder performativ gedacht und wollte den Server entlasten.

Mal gucken was Herror darauß macht.
 
Also so in die Richtung des ersten Vorschlages habe ich auch gedacht. Das Problem sah ich einfach nur darin, dass ich nicht Stundengenau arbeiten kann und vorher festlege, wann ein Monat zu ende ist und nicht auf den Tag genau anzeigen kann.

D.h. dass am 32. tag einfach nur die Anzahl der Downloads des 1. Tages rausgenommen werden.
Genauso bei Stunde 25 die Downloads der 1. Stunde rausgenommen werden und so alles fließend übergeht.

Die Möglichkeit würde bei der 2. Mehtode bestehen, aber ich befürchte, dass das meine Datenbank zu sehr belasten würde, da die Downloads ein Zentraler Inhalt meiner Seite sind... wäre das so nebenbei, dann würde ich das auch so machen können.

Habe mir schon überlegt irgendwo den timestamp abzuspeichertn und ummer kontrollieren zu lassen, wie weit die Staps voneinander entfertnt sind und so, aber habe keine möglichkeit gefunden, das auch Datenbankschonend zu machen...

P.S. ich rechne mit hunderten von tausenden downloads, also mache ich mir auch etwas sorgen um die datenmenge die beim zählen auftreten kann :)
 
Zuletzt bearbeitet:
Hi,

P.S. ich rechne mit hunderten von tausenden downloads, also mache ich mir auch etwas sorgen um die datenmenge die beim zählen auftreten kann :)

kannst Du das mal etwas genauer einschätzen, also ungefähr pro Monat oder Woche z.B.?

Die Datenbankabfragen an sich sollten nicht so das Problem sein, da MySQL eine ziemlich umfangreiche Sammlung an Datums- und Zeitfunktionen bietet.

LG
 
also. erwarte pro Datei ca 500-1000 Downloads pro Monat. Und habe im Moment knapp über 150 Dateien online.

Täglich kommen 2-6 Dateien hinzu.
 
Die Datenbankabfragen an sich sollten nicht so das Problem sein, da MySQL eine ziemlich umfangreiche Sammlung an Datums- und Zeitfunktionen bietet.

Hast du da evtl. mal ein Link mit einer zusammenfassung dieser? Mit sowas musste ich die letzten tage auch kämpfen und atm führt es dazu das ich immernoch dabei bin timestamps in der Datenbank zu speichern und diese mit php zu verarbeiten. Irgendwie habe ich es nicht hinbekommen etwas brauchbares für MySQL zu finden.

gruß trage
 
Um meine idee kurz zu erklären:
Den tag über sammle ich Bündel mit Downloads in einer Stunde.
Die Woche über sammle ich dann Bündel mit Downloads pro Tag.
Den Monat über sammle ich dann Bündel mit Downloads pro Woche.
und im Jahr sammle ich Bündel mit Downloads pro Monat.

Dadurch kann ich den Tag über das Bündel, das älter ist als 24 Stunden löschen und habe so einen durchgängigen counter ohne dass ich alles am anfang des Tages über löschen muss.
Das selbe Spiel auch für den ganzen Rest.

Anschließend sammle ich alles zusammen und trage die Summe aller Bündel in den Download ein, weil das das sortieren der Charts einfacher machen wird.

Was meint ihr? Perfekt, oder habt ihr Verbesserungsvorschläge?

PHP:
<?php include("connect.inc.php");
	
	######################################################################################################################################################
	### Trage ein, Pro Stunde ein Bündel. Gucke ob es in der letzten Stunde bereits einen Download gab und trage ein, sonst mache ein neues Bündel auf ###
	######################################################################################################################################################
	
	$abfragec = "SELECT * FROM `download1tag` WHERE `timestamp` >".(time()-3600);
	$ergebnisc = mysql_query($abfragec);
	$rowc = mysql_fetch_object($ergebnisc);
	
		if(!$rowc)
		{	
			$SQL = "INSERT INTO `download1tag` (`downloadid`, `count`, `timestamp`) VALUES ('".mysql_real_escape_string($_REQUEST[id])."', '1', '".time()."');";
			mysql_query($SQL);
		}
		else
		{
			++$rowc->count;
			$SQL = "UPDATE `DB469909`.`download1tag` SET `count` = '$rowc->count' WHERE `download1tag`.`id` =$rowc->id LIMIT 1 ;";
			mysql_query($SQL);
		}
	
	################################################################################################################################################
	### Trage ein, Pro Tag ein Bündel. Gucke ob es in dem letzten Tag bereits einen Download gab und trage ein, sonst mache ein neues Bündel auf ###
	################################################################################################################################################
	
	$abfraged = "SELECT * FROM `download2woche` WHERE `timestamp` >".(time()-86400);
	$ergebnisd = mysql_query($abfraged);
	$rowd = mysql_fetch_object($ergebnisd);
	
		if(!$rowd)
		{	
			$SQL = "INSERT INTO `download2woche` (`downloadid`, `count`, `timestamp`) VALUES ('".mysql_real_escape_string($_REQUEST[id])."', '1', '".time()."');";
			mysql_query($SQL);
		}
		else
		{
			++$rowd->count;
			$SQL = "UPDATE `DB469909`.`download2woche` SET `count` = '$rowd->count' WHERE `download2woche`.`id` =$rowd->id LIMIT 1 ;";
			mysql_query($SQL);
		}
		
	####################################################################################################################################################
	### Trage ein, Pro Woche ein Bündel. Gucke ob es in der letzten Woche bereits einen Download gab und trage ein, sonst mache ein neues Bündel auf ###
	####################################################################################################################################################
		
	$abfraged = "SELECT * FROM `download3monat` WHERE `timestamp` >".(time()-604800);
	$ergebnisd = mysql_query($abfraged);
	$rowd = mysql_fetch_object($ergebnisd);
	
		if(!$rowd)
		{	
			$SQL = "INSERT INTO `download3monat` (`downloadid`, `count`, `timestamp`) VALUES ('".mysql_real_escape_string($_REQUEST[id])."', '1', '".time()."');";
			mysql_query($SQL);
		}
		else
		{
			++$rowd->count;
			$SQL = "UPDATE `DB469909`.`download3monat` SET `count` = '$rowd->count' WHERE `download3monat`.`id` =$rowd->id LIMIT 1 ;";
			mysql_query($SQL);
		}
		
	####################################################################################################################################################
	### Trage ein, Pro Monat ein Bündel. Gucke ob es in der letztem Monat bereits einen Download gab und trage ein, sonst mache ein neues Bündel auf ###
	####################################################################################################################################################
			
	$abfraged = "SELECT * FROM `download4jahr` WHERE `timestamp` >".(time()-2620800);
	$ergebnisd = mysql_query($abfraged);
	$rowd = mysql_fetch_object($ergebnisd);
	
		if(!$rowd)
		{	
			$SQL = "INSERT INTO `download4jahr` (`downloadid`, `count`, `timestamp`) VALUES ('".mysql_real_escape_string($_REQUEST[id])."', '1', '".time()."');";
			mysql_query($SQL);
		}
		else
		{
			++$rowd->count;
			$SQL = "UPDATE `DB469909`.`download4jahr` SET `count` = '$rowd->count' WHERE `download4jahr`.`id` =$rowd->id LIMIT 1 ;";
			mysql_query($SQL);
		}	
	
	################################################################################################################################################################
	### Prüfen, ob es Einträge gibt, die älter als 24 Stunden sind. Wenn ja, dann werden sie gelöscht###
	################################################################################################################################################################
	
		$SQL = "DELETE FROM `DB469909`.`download1tag` WHERE `timestamp` <".time()." -86400";
		mysql_query($SQL);
	
	############################################################################################################################################################
	### Prüfen, ob es Einträge gibt, die älter als 7 Tage sind. Wenn ja, dann werden sie gelöscht###
	############################################################################################################################################################
	
		$SQL = "DELETE FROM `DB469909`.`download2woche` WHERE `timestamp` <".time()." -604800";
		mysql_query($SQL);
	
	
	############################################################################################################################################################
	### Prüfen, ob es Einträge gibt, die älter als 4 Wochen sind. Wenn ja, dann werden sie gelöscht###
	############################################################################################################################################################
	
		$SQL = "DELETE FROM `DB469909`.`download3monat` WHERE `timestamp` <".time()." -2620800";
		mysql_query($SQL);
	
	
	############################################################################################################################################################
	### Prüfen, ob es Einträge gibt, die älter als 1 Jahr sind. Wenn ja, dann werden sie gelöscht###
	############################################################################################################################################################
	
		$SQL = "DELETE FROM `DB469909`.`download4jahr` WHERE `timestamp` <".time()." -31536000";
		mysql_query($SQL);

################################################################
### Trage alle Inhalte zusammen in die Tabelle des Downloads ###
################################################################

$abfrage = "SELECT * FROM `download` WHERE id=".mysql_real_escape_string($_REQUEST[id])." LIMIT 0, 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

++$row->downloads;
$SQL = "UPDATE `DB469909`.`download` SET `downloads` = '$row->downloads' WHERE `download`.`id` =".mysql_real_escape_string($_REQUEST[id])." LIMIT 1 ;";
mysql_query($SQL);

$downloads = 0;
$abfrage = "SELECT * FROM `download1tag` WHERE downloadid=".mysql_real_escape_string($_REQUEST[id])."";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
	$downloads = $downloads + $row->count;
}
$SQL = "UPDATE `DB469909`.`download` SET `dltag` = '$downloads' WHERE `download`.`id` =".mysql_real_escape_string($_REQUEST[id])." LIMIT 1 ;";
mysql_query($SQL);

$downloads = 0;
$abfrage = "SELECT * FROM `download2woche` WHERE downloadid=".mysql_real_escape_string($_REQUEST[id])."";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
	$downloads = $downloads + $row->count;
}
$SQL = "UPDATE `DB469909`.`download` SET `dlwoche` = '$downloads' WHERE `download`.`id` =".mysql_real_escape_string($_REQUEST[id])." LIMIT 1 ;";
mysql_query($SQL);

$downloads = 0;
$abfrage = "SELECT * FROM `download3monat` WHERE downloadid=".mysql_real_escape_string($_REQUEST[id])."";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
	$downloads = $downloads + $row->count;
}
$SQL = "UPDATE `DB469909`.`download` SET `dlmonat` = '$downloads' WHERE `download`.`id` =".mysql_real_escape_string($_REQUEST[id])." LIMIT 1 ;";
mysql_query($SQL);

$downloads = 0;
$abfrage = "SELECT * FROM `download4jahr` WHERE downloadid=".mysql_real_escape_string($_REQUEST[id])."";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
	$downloads = $downloads + $row->count;
}
$SQL = "UPDATE `DB469909`.`download` SET `dljahr` = '$downloads' WHERE `download`.`id` =".mysql_real_escape_string($_REQUEST[id])." LIMIT 1 ;";
mysql_query($SQL);

$abfrage = "SELECT * FROM `download` WHERE id=".mysql_real_escape_string($_REQUEST[id])." LIMIT 0, 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
mysql_close($verbindung); ?>

<meta http-equiv='refresh' content='0; URL=<?=$row->link?>'>
 
Zurück