Mein kleiner PHP-MySQL-Counter - aber wie?

Sprite

Mitglied
Ich möchte für meine Seite gerne einen eigenen Counter erstellen.
Problem hierbei: wenig PHP-Kenntnisse, wenig MySQL-Kenntnisse.


Jedoch habe ich eine genaue Vorstellung, was der Counter machen soll, darum möchte ich es kurz nennen.

Die counter.php (ich möchte den gesamten Counter in nur dieser Datei haben) wird überall auf der Seite aufgeufen.
Betritt ein Gast die Seite, soll folgendes gemacht werden:

  • der Besuch wird erfasst
  • die IP wird per $REMOTE_ADDR; erfasst
  • die IP wird für eine (configuierbare) Zahl X gespeichert, die Reloadsperre also
  • der Tag wird per date("d.m.y"); erfasst
  • die Uhrzeit wird per date("H:i:s"); erfasst
  • die Hostmark wird per $REMOTE_HOST; erfasst
  • der Browser wird per $HTTP_USER_AGENT; erfasst
  • der Referer wird per $HTTP_REFERER; erfasst
  • der Zugriff auf die Seite wird per $REQUEST_URI; erfasst

Diese Daten sollen in eine MySQL-Tabelle geloggt werden.

Wenn der selbe User mit der selben IP innerhalb der Reloadsperrenzeit nochmal auf die Seite zugreift, soll ausschließlich der Seitenzugriff per $REQUEST_URI; geloggt werden.

Nun das eigentliche Problem: Wenn 24 Stunden vergangen sind, sollen die geloggten Daten per eMail an mich gesendet werden. Dort werden die Mails 10 Tage von mir gespeichert, bevor sie automatisch gelöscht werden. Die 24 Stunden sollen nicht per Cronjob, sondern per einfachen Zeitstamp kontrolliert werden, auch wenn sich die Absendezeit dadurch immer verschiebt.


Das heißt, wenn die Mail bei mir ankommt, hätte ich es gerne so, dass nach oben genannten Schema die eMail in etwa so aussieht:



1005 | 184.188.166.38 | 03.11.04 | 19:12:47 | p12345.dip.t-dialin.net
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) | http://www.google.de/search?q=Terraristik
index.html, terrastik/index.html, terraristik/leguane.html, terraristik/futter.html, kontakt/formular.html, kontakt/send.php, ueber/ueber.html, links/index.html

1006 | 173.143.101.5 | 03.11.04 | 19:19:25 | p54321.dip.t-dialin.net
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) |
index.html, bilder/bild1.html


Sozusagen:

Besucher |IP | Datum | Uhrzeit | Hostmark
Browser | Referer
Zugriff 1, Zugriff 2, Zugriff 3, Zugriff 4, Zugriff 5, etc.,

Es soll also solange nur den Request loggen, bis die Reloadsperrenzeit von diesem User abgelaufen ist, dann wieder ein kompletter Log.

Soviel zu Teil 1 des Scriptes.

Nun ein kleiner Teil 2:

Die counter.php soll nicht bloß loggen, sondern auch anzeigen. Angezeigt werden sollen:
X Besucher gesamt | X Besucher gestern | X Besucher heute | X Besucher online





Die Bremse an der Umsetzung dieses Scriptes bin ich. Denn bei PHP bin ich leider erst so weit, ein paar verschachtelte if-else-Sachen oder einzelne Code-Schnipsel schreiben zu können. Bei MySQL in etwa das gleiche. So habe ich immer keinen Plan, womit ich zuerst anfangen soll, wie ich das in die (bzw. in welche) Tabellen schreiben sowie auslesen lasse und wenn dann irgendwas nicht geht, dann halte ich mich damit über Stunden auf...

Es wäre demnach schön, wenn ihr mir zusammen in irgendeiner Art behifllich sein könntet, ich bin für jede Hilfe dankbar.
 
Hi!

Ich möchte das ganze auch machen, dass heißt ich möchte auch einen eigenen Counter mit Statistischer Auswertung machen. Du hast mir auf jedenfall schonmal eine gute Anregung gegeben, wenn du Fragen hast kannst du dich ja per PN bei mir melden.....
 
Also das mit der Zeit würde ich wie folgt lösen:

Lege dir eine neue Tabelle in deiner Datenbank an, die meinetwegen sync heißt. In dieser Tabelle nur ein Eintrag mit Primärschlüssel und Unix-Timestamp.

Schreibe nun eine datei mail_sync.php die du später per include in deine Hauptseite einbindest. Jedesmal wenn jemand auf deine Seite kommt soll nun diese mail_sync.php durchlaufen werden.

In der mail_sync.php vergleichst du die in der Tabelle eingetragene Zeit mit der aktuellen Zeit. Wenn Unterschied > 24h dann löse mail Funktion aus und setze danach die aktuelle Zeit in die Datenbank per Update Befehl. Du kannst natürlich auch jedesmal einen neuen Eintrag erzeugen um das ganze zu verfolgen. Aber irgendwann wird deine Datenbank zu groß und deine Besucher sollen ja auch nicht so lange auf den Seitenaufbau warten.

Wie die Funktion mail() funktioniert guckst du hier: http://www.selfphp.de/funktionsreferenz/mail_funktionen/mail.php

Mit dieser Lösung erreichst du zwar nicht, dass genau alle 24 Stunden eine mail kommt, aber je nach deinem Besucheraufkommen wenigstens so ungefähr. Wenn natürlich 3 Tage keiner auf deiner Seite ist, gibt's auch 3 Tage keine mail. Aber wenn kein User da gibt's wohl auch keine wirklichen Informationen, oder?

Hier noch ein paar nützliche mySQL-Befehle:

Maximalwert:
SELECT MAX(spaltenname) AS maximum FROM tabellenname

Minimum:
SELECT MIN(spaltenname) AS minimum FROM tabellenname

Summe:
SELECT SUM(spaltenname) AS summe FROM tabellenname

Durchschnitt:
SELECT AVG(spaltenname) AS durchschnitt FROM tabellenname

Ausgabe der letzten Zeile (geordnet nach zeit (time))
SELECT * FROM tabellenname ORDER BY time DESC LIMIT 1

Das kannst du natürlich auch alles in einem Befehl schreiben.
 
Zuletzt bearbeitet:
für was brauchst du eigentlich den ihre daten zu speichern wenn ich fragen darf? man kann ein counter der die gleiche funktionen hat, auch ohne MySQL proggen, bloß müsstest du, um die IP`s der Besucher zu sehen dann praktisch

http://www.deinname.de/deinverzeichniss/counter.txt (ist ein beispiel)

isn beispiel, aufjedenfall hab ich mein counter auch so geproggt, bloß ohne MySQL weil ich des net so unbedingt mag *lol* und du kannst natürlich die .txt datei auch 54g5sdf4sd5f45sdf.txt benennen, so kommt dann eigentlich niemand ausser du, auf die IP`s der besucher...


greez

XXX
 
Ein solchen Text-Counter habe ich gerade.

Sprich er loggt alle Daten, so wie ich es oben angegeben habe und verschickt einmal per eMail, bevor er die Textdatei löscht.

Allerdings ist bei diesem Counter das Problem, dass er immer wieder jeden Zugriff loggt, statt nur einmal und dann an der IP sieht, dass es derselbe Besucher ist und nur noch den Request speichert.


Zu der MySQL-Variante hatte ich mich von einem Kollegen überreden lassen, der sich perfekt mit PHP und MySQL auskennt. Er schrieb mir dann den counter komplett um, mit dem Resultat, das 3 Fehler auftraten:
1. Den Request hat es bei jedem Zugriff gleich 7 mal hintereinander geschrieben.
2.Wenn die Textdatei geleert wurde, fehlen beim neuen Log-Eintrag grundsätzlich die ersten 8-10 Zeichen (?).
3. Wenn der Timestamp abgelaufen ist, sendet es mir bei jedem weiteren Zugriff auf die Seite eine eMail... :(

Seitdem versuche ich alle 2 Wochen, dass er mir mal hilft, doch seit 1 Jahr drückt er sich und bringt nur Ausreden.


Hmm... Zwickmühle... eigentlich ist es mir egal, ob Textdatei oder MySQL.

Aber ich werde sobald ich wieder zuhause bin, mal den fehlerhaften Counter hier reinstellen, vielleicht macht es mehr Sinn, diesen zu reparieren, als einen ganz neuen mit MySQL zu machen.


Die Frage nach dem "Warum ein solches Logfile?" sollte sich jeder selbst beantworten können, wenn man mal bedenkt, was heute alles an Hackern, Brutforcern, Gästebuch-Floodern, etc. unterwegs ist.
 
Entschuldigt den Doppelpost. Hier nun der fehlerhafte Code des neuen Counters, der schon in etwa das macht, was ich will, bis auf die 3 (Korrektur: 4) Fehler:

1. den Request_URI schreibt es bei jedem Zugriff (einmal F5 z.B.) gleich 7 mal hintereinander
2. wenn die Textdatei geleert wurde, fehlen beim neuen Log-Eintrag grundsätzlich die ersten 8-10 Zeichen des neuen Log-Files
3. ist der Timestamp abgelaufen, leert es das Log und sendet mir eine Mail... jedochsendet es dann bei jedem weiteren Zugriff (einmal F5 z.B.) auf die Seite eine weitere eMail... für immer...
4. zudem ändern sich nach Auslösung des Fehler 3 dann $heute $gestern und $gesamt nicht mehr

Der Code:
PHP:
include('config.php'); 

// $server kommt aus der config.php und beinhaltet '/var/www/user/html/etc.';

// Daten aus Datei einlesen
$txtcounter	= $server.'counter/counter.txt';
$zeile	= file($txtcounter);

// Daten für Statistik-Mail
$txtlog	= $server.'counter/logfile.txt';
$mailto	= 'name@domain.de';
$mailfrom	= 'Statistik-Generator <name@domain.de>';
$mailsubj	= 'Counter Statistik - '.date("d.m.Y");


// Variablen für Datumsberechnung und Zählung
$now		= time();
$datum	= date("d.m.y");
$uhrzeit	= date("H:i:s");
// Ablauf nach Sekunden
$expire	= 600;
$reload	= 600;
$count	= 0;
$setdate	= 0;


// Daten der Session vorbereiten
$ip		= $REMOTE_ADDR;
$host		= $REMOTE_HOST;
$port		= $REMOTE_PORT;
$referer	= $HTTP_REFERER;
$browser	= $HTTP_USER_AGENT;
$path		= $REQUEST_URI;

$text		= $now."#".$ip."\n";


// Prüfen ob bereits geloggt
foreach($zeile as $sperre){
	$arraysp = explode("#",$sperre);

	if ($ip==rtrim($arraysp[1]) && $arraysp[0] > $now -$reload){
		$vorhanden=1;
	}
}

foreach($zeile as $wert){

	$array = explode("#",$wert);

	if ($array[0]=='datum' && rtrim($array[1])!=$datum){
		$setdate=1;
	}


	// Falls schon geloggt, die Daten sortieren und säubern
	if ($vorhanden==1){
		if ($array[0]=='heute' && $setdate==0){
			$heute=rtrim($array[1]);
		}

		if ($array[0]=='heute' && $setdate==1){
			$heute=1;$gestern=rtrim($array[1]);
		}
		if ($array[0]=='gesamt'){
			$gesamt=rtrim($array[1]);
		}
		if ($array[0]=='gestern' && $setdate==0){
			$gestern=rtrim($array[1]);
		}
		// Eintrag Logfile für Statistik-Mail wenn schon geloggt nur $path nacheinander mit Komma
		$puffer = "$path".", ";
		$stats = fopen($txtlog,"a");
		fwrite ($stats, $puffer);
		fclose ($stats);
	}


	// Falls noch nicht geloggt, hinzufügen
	if ($vorhanden!=1){
		if ($array[0]=='heute' && $setdate==0){
			$heute=rtrim($array[1])+1;
		}
		if ($array[0]=='heute' && $setdate==1){
			$heute=1;$gestern=rtrim($array[1]);
		}
		if ($array[0]=='gestern' && $setdate==0){
			$gestern=rtrim($array[1]);
		}
		if ($array[0]=='gesamt'){
			$gesamt=rtrim($array[1])+1;

		// Eintrag Logfile für Statistik-Mail falls nicht geloggt
		$puffer = "\n\n$gesamt $datum $uhrzeit $ip $host $path\n$browser $referer\n";
		$stats = fopen($txtlog,"a");
		fwrite ($stats, $puffer);
		fclose ($stats);

		}
	}
}


// Counter-Stände schreiben
$puffer  = "datum#$datum\nuhrzeit#$uhrzeit\nheute#$heute"; 
$puffer .= "\ngestern#$gestern\ngesamt#$gesamt\n\n$text";
$fp = fopen($txtcounter, "w");
fwrite ($fp,$puffer,750);
fclose($fp);


// Online-User ermitteln
$fpadd = fopen($txtcounter, "a");

foreach($zeile as $useronline){
	$arruseronline = explode ("#",$useronline);
	if ($arruseronline[0] > $now - $expire && $ip != rtrim($arruseronline[1]))
		fwrite ($fpadd,$useronline, 750);
}
fclose($fpadd);


// Neu geschriebene Daten auslesen und zählen
$content = file($txtcounter);
for ($x = 0; $x < count($content); $x++){
	$count += 1;
}


// Aktuelle Counter-Stände ausgeben
$onlinenow = $count - 6;
echo '<b>'.$gesamt.'</b> Besucher gesamt | <b>'.$gestern.'</b> Besucher gestern | <b>';
echo $heute.'</b> Besucher heute | <b>'. $onlinenow .'</b> Besucher online';


// Mail versenden wenn 24h vergangen
$stats	= fopen($txtlog, "r");
$lastmail	= fread($stats, 10);
$lastmail	+= 86400;
$newmail	= filemtime($txtlog);

if ($newmail > $lastmail){
	$body	= fread($stats, filesize($txtlog));
	// Mail senden und Datei leeren
	@mail ($mailto, $mailsubj, $body, "From: $mailfrom");
	$stats = fopen($txtlog, "w");
}
fclose ($stats);
 
Zurück