Anzeige
Tutorialbeschreibung

Erweiterter Besucherzähler (Counter) mit grafischer Ausgabe

Erweiterter Besucherzähler (Counter) mit grafischer Ausgabe

Hier werde ich euch zeigen, wie ihr einen flexiblen Besucherzähler in PHP programmiert.
MySQL wird für diesen Counter benötigt. Als Highlight wird der Besucherzähler eine grafische Ausgabe
der letzten 31 Tage generiren können.


Hier werde ich euch zeigen, wie ihr einen flexiblen Besucherzähler in PHP programmiert.
MySQL wird für diesen Counter benötigt. Als Highlight wird der Besucherzähler eine grafische Ausgabe
der letzten 31 Tage generiren können. Hier werde ich euch zeigen, wie ihr einen flexiblen Besucherzähler in PHP programmiert.
MySQL wird für diesen Counter benötigt. Als Highlight wird der Besucherzähler eine grafische Ausgabe
der letzten 31 Tage generiren können.

Bilder


Als erstes solltet ihr darüber im klaren sein, wie die Struktur in OOP (Objekt orientierter Programmierung) aussieht, denn zur besseren Handhabkeig werden wir unseren Zähler in einer Klasse aufbauen. Solltet ihr noch nie in OOP gearbeitet haben, so empfehle ich euch, mal dieses Tutorial anzuschauen tut.php-q.net/klassen.html


INHALTSVERZEICHNIS

  1. Der Aufbau auf imaginärer Ebene
  2. MySQL Tabelle
  3. Befehlsübersicht
  4. Der Code
  5. Der komplette Code (zusammengefasst)
  6. Benutzunen des Counters
  7. Beispielstatistik
  8. Schlusswort


Der Aufbau auf imaginärer Ebene

Da unser Zähler am Ende eine möglichst genaue Anzahl an Besuchern ermitteln soll, müssen wir zuerst dafür sorgen, dass ein Besucher nur ein Mal pro Tag gezählt wird.

Vorweg: Wir werden dies niemals mit einer 100%-igen Sicherheit erreichen können.

Allerdings werden wir versuchen, durch 2 unterschiedliche Methoden, den Besucher zu identifizieren und ihn somit nur einmal zu zählen. Diese 2 Methoden sind:
  1. Sperre eines Benutzers für 24 Stunden durch die IP
  2. Sperre eines Benutzers für 24 Stunden über ein Cookie
Nun die Möglichen Lücken die diese Methoden mitsichbringen:
  1. Die IP eines Benutzers kann sich innerhalb eines Tages ändern, z.B. wenn der Benutzer das Modem/ den Router neu startet oder er eine dynamische IP besitzt (z.B. AOL Kunden)
  2. Das speichern von Cookies setzt voraus, dass es vom Benutzer erlaubt wird. Da Cookies Datensätze sind, die auf der Clientmaschine gespeichert werden, können sie natürlich auch ohne unseren Einfluss wieder gelöscht werden.
Nun zur Methode des Zählens. Da wir mit Cookies arbeiten, müssen wir den Counter "starten" (iniziieren) vor jeglicher Ausgabe der Homepage. Beim erstellen dieser sogenannten Instanz der Klasse werden wir dann auch gleich prüfen, ob der Besucher gezählt werden soll oder nicht. Falls ja, wird er in unsere MySQL Tabelle gespeichert. Dazu nehmen wir die Daten id ip und time des Benutzers (mehr dazu weiter unten). Des weiteren werden wir 3 Methoden der Klasse anfügen, eine Methode zum abfragen der Daten als Zahlen, eine Methode um die grafische Anzeige zu bekommen und eine Methode um eine MySQL Verbindung aufzubauen.
Die Methode der Rückgabe der Werte als Zahlen unterstützt dabei die folgenden Formate
  • Beuscher Heute
  • Besucher Gestern
  • Besucher in den letzten 7 Tagen
  • Besucher in den letzten 31 Tagen
  • Besucher Gesamt
Die grafische Anzeige unterstützt die letzten 31 Tage zzgl. des aktuellen Tages.

Die MySQL Tabelle

Wir werden pro Besucher einen neuen Datensatz in der Tabelle ablegen. Dieser Datensatz besteht aus 3 Werten
  1. id - eindeutiger numersicher Bezeichner der Datensätze
  2. ip - IP des Besuchers
  3. time - Zeitpunkt des Besuches
Diese Tabelle kännt ihr mit dem folgenden Code erstellen

CREATE TABLE `counter` (
`id` int( 10 ) NOT NULL AUTO_INCREMENT ,
`ip` varchar( 16 ) COLLATE latin1_general_ci NOT NULL ,
`time` bigint( 20 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM DEFAULT CHARSET = latin1 COLLATE = latin1_general_ci



Befehlsübersicht


bevor wir mit dem eigentlichen Code anfange möchte ich euch nun die Links des Manuals geben, in denen ihr die verwendeten Funktionen nachlesen könnt, falls ihr sie nicht kennt.

Der Code

Kommen wir nun endlich zum eigentlichen Code, fangen wir an mit der Grundstruktur der Klasse - Für nähere Informationen zu den Arbeitsschritten bitte die Kommentare im Quelltext lesen!

<?php
class counter
{
  var 
$ip;
  var 
$time;
  var 
$yesterday;
  var 
$tomorrow;
  var 
$mysqlhost;
  var 
$mysqluser;
  var 
$mysqlpass;
  var 
$mysqldatabase;
  var 
$mysqllink;
  function 
counter()
  {
    
//Die benötigten Daten bekommen
    
$this->ip $_SERVER["REMOTE_ADDR"]; //IP des Benutzers bekommen
    
$this->time time(); //aktuelle Zeit nehmen
    
$this->yesterday time() - 60*60*24//24 Stunden zurückrechnen
    
$this->tomorrow mktime(23,59,59,date(''m''),(date(''d'')-1)); //24 Stunden vorrechnen
    
$this->today mktime(0,0,1,date(''m''),date(''d'')); //24 Stunden vorrechnen
    
$this->mysqlhost "localhost"//Euer MySQL-Host
    
$this->mysqluser "root"//Euer MySQL-Benutzername
    
$this->mysqlpass "password"//Euer MySQL-Passwort
    
$this->mysqldatabase "database"//Eure MySQL-Datenbank
    
$this->mysqlconnect(); //bauen wir eine MySQL Verbindung auf

    //Prüfen ob der Benutzer gezählt wird
    //Zuerst prüfen wir durch abfragen des Cookies
    
if(!isset($_COOKIE[''counter'']))
    {
      
//Der Benutzer hat keinen Cookie - prüfen wir nochmals mittels IP
      
$qry "SELECT * FROM `counter` WHERE `time` > ''".$this->yesterday."'' LIMIT 1";
      
//prüfen ob der Benutzer innerhalb der letzten 24 Stunden in der Datenbank steht
      
$qry mysql_query($qry);
      if(
mysql_num_rows($qry) == 0)
      {
        
//Der Benutzer ist auch nicht in der Datenbank, wir können Ihn zählen
        
$this->countuser();
      }
    }
  }
}
?>

Dieser Teil ist der Anfang unserer Klasse, hier wird der Counter initialisiert und falls nötig der Besucher gezählt.
Doch schon hier fällt uns auf, dass etwas fehlt - genau - die Verbindung zur MySQL Datenbank.
Fügen wir also die Methode mysqlconnect() hinzu:

  function mysqlconnect()
  {
    
//Aufbau der Verbindung zum MySQL Server
    
if(!$this->mysqllink = @mysql_connect($this->mysqlhost,$this->mysqluser,$this->mysqlpass))
    {
      
//Anscheinend ist der Aufbau fehlgeschlagen
      //Fehlermeldung werfen und Script abbrechen
      
echo "Verbindung zum MySQL Server nicht möglich!";
      exit();
    }
    
//Datenbank auswählen
    
if(!@mysql_select_db($this->mysqldatabase))
    {
      
//Anscheinend ist die Verbindung zur Datenabnk fehlgeschlagen
      //Fehlermeldung werfen und Script abbrechen
      
echo "Datenbank nicht verfügbar!";
      exit();
    }
  }
und es fehlt eine Methode um den Benutzer zu zählen. Legen wir auch diese an:

  function countuser()
  {
    
//hier werden wir den Benutzer zählen
    //Dazu müssen wir Ihn nur in der Datenbank eintragen
    
$qry "INSERT INTO `counter` (ip,time) VALUES (''".$this->ip."'',".$this->time.")";
    
mysql_query($qry);
    
//Schon erledigt - allerdings müssen wir noch den Cookie setzen
    
setcookie ("counter","1",$this->tomorrow);
    
//Informationen zu setcookie unter php.net/setcookie
  
}
So nun ist unser Counter schon soweit ausgerüstet dass wir Besucher zählen können. Doch wo ist die Ausgabe?!

Fangen wir nun zunächst mit <?php
function output($type = array(''heute'',''gestern'',''woche'',''monat'',''gesamt''))
{
  
//Ermitteln wir zunächst alle möglichen Angaben.
  //Heute - Heute, d.h. ab dem heutigen Datum um 00:00:00 Uhr
  //Wir ermitteln den Timestamp:
  
$heute mktime(0,0,0,date(''m''),date(''d''));
  
//Die Parameter von mktime sind deshalb
  //0,0,0 -> 0 Stunden, 0 Minuten, 0 Sekunden (00:00:00 Uhr)
  //date(''m''),date(''d'') -> das sind die Werte des Heutigen Tages
  //Monat,Tag | Mehr infos: php.net/mktime

  //Für Gestern rechnen wir nun einfach 24 Stunden ab
  //Da wir in Sekunden Rechnen entspricht 60*60*24 einem Tag
  
$gestern $heute 60*60*24;

  
//Nun für die Woche und den Monat
  
$woche $heute 60*60*24*7;
  
$monat $heute 60*60*24*31;

  
//Nun kommen die Werte dazu aus der Datenbank, wir werden sie in einem array speichern
  //Heute:
  
$counter[''heute''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$heute));
  
//Gestern:
  
$counter[''gestern''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` <= ".$heute." AND `time` >= ".$gestern));
  
//Woche:
  
$counter[''woche''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$woche));
  
//Monat:
  
$counter[''monat''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$monat));
  
//Gesamt:
  
$counter[''gesamt''] = mysql_num_rows(mysql_query("SELECT * FROM `counter`"));

  
//Kommen wir nun zurück zu unserem Parameter $type der deiser Funktion übergeben wurde
  //Er enthält ein Array mit den Werten die wir haben wollen. Dies ermöglicht uns später
  //ohne aufwand, zum Beispiel nur den Wert für Heute abzufragen, ohne die Methode ändern zu müssen
  //Schreiben wir in das Array $back nun die Werte die wir möchten
  
foreach($type as $v)
  {
    
$back[$v] = $counter[$v];
  }
  
//nun können wir diese Werte zurückgeben
  
return $back;
}
?>

hätten wir dass nun auch erledigt. Fehlt noch der größte Teil unseres Scriptes. Die Ausgabe der Statistik in einer grafikähnlichen Anschauungsweise.

<?php
function graphic()
{
  
//Zuerst benötigen wir die werte der letzten 31 Tage
  //Da wir nicht selber 31 SQL-Abfragen schreiben wollen
  //werden wir sie in eine Schleife verfrachten
  //Doch zuerst brauchen wir den heutigen tag
  
$time mktime(0,0,0,date(''m''),date(''d''));
  
//nun werden wir die Timestamps der letzten 31 Tage in ein array schreiben
  //Achtung dieses Array fängt mit 1 An nicht mit 0. der Key 1 ist heute, 2 ist gestern usw.
  
$timestamps = array('''');
  while(
count($timestamps)<32)
  {
    
$timestamps[] = $time//Das Array ausfüllen
    
$time -= 60*60*24//Immer 1 Tag zurückrechnen
  
}
  
//gut nun haben wir das array - fehlen die Werte der Tage
  //auch das machen wir wieder in einem Array und einer Schleife
  
foreach($timestamps as $k=>$val)
  {
    if(
$k==0)
      continue;
    if(
$k==1)
      
$values[$k] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$val));
    else
    {
      
$time2 $val 60*60*24;
      
$values[$k] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` < ".$time2." AND `time` >= ".$val));
    }
  }
  
//nun haben wir die Werte der Enstprechenden Tage und können daraus eine Tabelle entstehen lassen.
  //als erstes benötigen wir die Anzahl der Zeilen - jede Zeile ist 1 Besucher
  //dazu ermitteln wir den höchsten Wert
  
$height max($values);
  
$scale 1//Maßstab ist 1 Besucher pro Zeile
  
$nheight $height;
  while(
$nheight 10//Mehr als 10 Zeilen sind unsinnig!
  
{
    
//Daher werden wir in diesem Falle den Maßstab ändern
    //Wir werden den Maßstab auf 2 Besucher pro Zeile setzen!
    
$scale++;
    
$nheight $height/$scale;
    
//Falls jetzt immernoch mehr als 50 ist, setzen wir Maßstab
    //auf 3,4,5,6,7, usw. Besucher pro Zeile
  
}
  
$height $nheight;
  
//kommen wir nun zum Erstellen der Tabelle
  //In HTML ist eine Tabelle so aufgebaut, dass wir zuerst die Zeilen und darin die Spalten
  //angeben müsssen, fangen wir also mit der Maßeinheit an!
  
$table ''<table cellpadding="0" cellspacing="0">'';
  
$table.= ''<tr>'';
  
$table.= ''<td style="vertical-align:bottom;">'';
  
$table.= ''<b>Besucher</b>'';
  
$table.= ''</td>'';
  
$table.= ''<td colspan="31" style="vertical-align:bottom;text-align:center;">'';
  
$table.= ''<b>Besucherstatistik (grafisch)</b>'';
  
$table.= ''</td>'';
  
$table.= ''</tr>'';
  
//Ab jetzt wird es schwieriger, denn wir müssen die Tabelle ab hier dynamisch generieren.
  //Dies geschieht in folgenden schleifen
  
$gone 0;
  for(
$i 0$i <= $height$i++) //schleife für Zeilen
  
{
    
$table.= ''<tr>'';
    
//oben sollte der höchste Wert stehen, also müssen wir nun die höhe mit dem
    //Maßstab verrechnen:
    
if(round(($height-$i)*$scale,0)!=0)
    {
      
$table.= ''<td style="height:20px; vertical-align:top;border-bottom:1px solid black;text-align:right;border-right:1px solid black;padding-right:2px;">'';
      
$table.= round(($height-$i)*$scale,0);
      
$table.= ''</td>'';
    }
    
//nun müssen 31 weitere spalten folgen mit den Balken.
    //Die Balken sollen jedoch durchgehend sein, und bekommen daher ein rowspan
    //Sie dürfen nur einmal angezeigt werden, d.h. es muss eine bedingung her
    
if(!$gone)
    {
      
$gone 1;
      for(
$j 31$j 0$j--)
      {
        
//hier generieren wir nun die balken, da der 31. Tag links stehen soll
        //müssen wir hier ''rückwärts'' denken
        //Wir wissen außerdem dass jede zeile 20 px hoch ist und können daher
        //errechnen wie hoch der balken sein soll
        //eine Zeile ist 20 px hoch
        //Bei einem maßstab von 1 = anzahl besucher*20
        //Bei einem maßstab von 2 = anzahl besucher*20/2
        //usw.
        
$heightofgraph $values[$j]/$scale*20+20;
        
$heightofgraph round($heightofgraph,0);
        
$widthofgraph 10//Wie breit soll ein Balken sein? 10 px dürfte ok sein
        
$colotofgraph "#54789a";
        
$table.= ''<td rowspan="''.($height+2).''" style="border-bottom:1px solid black;vertical-align:bottom;height:''.($height*20).'';width:20px;padding-left:2px;">'';
        
$table.= ''<div style="width:''.$widthofgraph.'';height:''.$heightofgraph.'';background-color:''.$colotofgraph.'';font-size:0px;">a</div>'';
        
$table.= ''</td>'';
      }
    }
    
$table.= ''</tr>'';
  }
  
//Nun haben wir unsere Tabelle fast fertig
  //Als letztes fügen wir noch die Beschriftung der Tage hinzu
  
$table.= ''<tr>'';
  
$table.= ''<td style="height:20px; vertical-align:top;border-bottom:1px solid black;border-right:1px solid black;text-align:right;padding-right:2px;">'';
  
$table.= ''0'';
  
$table.= ''</td>'';
  
$table.= ''</tr>'';
  
$table.= ''<tr>'';
  
$table.= ''<td>'';
  
$table.= ''&nbsp;'';
  
$table.= ''</td>'';
  
$table.= ''<td colspan="29" style="text-align:center;">'';
  
$table.= ''vor'';
  
$table.= ''</td>'';
  
$table.= ''</tr>'';
  
$table.= ''<tr>'';
  
$table.= ''<td style="vertical-align:bottom;">'';
  
$table.= ''&nbsp;'';
  
$table.= ''</td>'';
  for(
$k 30$k 0$k--)
  {
    
$table.= ''<td style="vertical-align:bottom;border-right:1px dotted black;padding:2px;text-align:center;">'';
    
$table.= $k;
    
$table.= ''</td>'';
  }
   
$table.= ''<td style="vertical-align:bottom;padding:2px;">'';
  
$table.= ''Heute'';
  
$table.= ''</td>'';
  
$table.= ''</tr>'';
  
$table.= ''<tr>'';
  
$table.= ''<td>'';
  
$table.= ''&nbsp;'';
  
$table.= ''</td>'';
  
$table.= ''<td colspan="29" style="text-align:center;">'';
  
$table.= ''Tagen'';
  
$table.= ''</td>'';
  
$table.= ''</tr>'';
  
$table.= ''</table>'';
  
//Unsere Tabelle ist fertig und wir können sie zurückgeben
  
return $table;
}
?>



Der Komplette Code

Zur besseren Übersichtlichkeit, hier nun der komplette Code:

<?php
error_reporting
(E_ALL);
class 
counter
{
  var 
$ip;
  var 
$time;
  var 
$yesterday;
  var 
$tomorrow;
  var 
$mysqlhost;
  var 
$mysqluser;
  var 
$mysqlpass;
  var 
$mysqldatabase;
  var 
$mysqllink;
  function 
counter()
  {
    
//Die benötigten Daten bekommen
    
$this->ip $_SERVER["REMOTE_ADDR"]; //IP des Benutzers bekommen
    
$this->time time(); //aktuelle Zeit nehmen
    
$this->yesterday time() - 60*60*24//24 Stunden zurückrechnen
    
$this->tomorrow mktime(23,59,59,date(''m''),(date(''d'')-1)); //24 Stunden vorrechnen
    
$this->today mktime(0,0,1,date(''m''),date(''d'')); //24 Stunden vorrechnen
    
$this->mysqlhost "localhost"//Euer MySQL-Host
    
$this->mysqluser "root"//Euer MySQL-Benutzername
    
$this->mysqlpass "zechert1"//Euer MySQL-Passwort
    
$this->mysqldatabase "database"//Eure MySQL-Datenbank
    
$this->mysqlconnect(); //bauen wir eine MySQL Verbindung auf

    //Prüfen ob der Benutzer gezählt wird
    //Zuerst prüfen wir durch abfragen des Cookies
    
if(!isset($_COOKIE[''counter'']))
    {
      
//Der Benutzer hat keinen Cookie - prüfen wir nochmals mittels IP
      
$qry "SELECT * FROM `counter` WHERE `time` > ''".$this->yesterday."'' LIMIT 1";
      
//prüfen ob der Benutzer innerhalb der letzten 24 Stunden in der Datenbank steht
      
$qry mysql_query($qry);
      if(
mysql_num_rows($qry) == 0)
      {
        
//Der Benutzer ist auch nicht in der Datenbank, wir können Ihn zählen
        
$this->countuser();
      }
    }
  }
  function 
mysqlconnect()
  {
    
//Aufbau der Verbindung zum MySQL Server
    
if(!$this->mysqllink = @mysql_connect($this->mysqlhost,$this->mysqluser,$this->mysqlpass))
    {
      
//Anscheinend ist der Aufbau fehlgeschlagen
      //Fehlermeldung werfen und Script abbrechen
      
echo "Verbindung zum MySQL Server nicht möglich!";
      exit();
    }
    
//Datenbank auswählen
    
if(!@mysql_select_db($this->mysqldatabase))
    {
      
//Anscheinend ist die Verbindung zur Datenabnk fehlgeschlagen
      //Fehlermeldung werfen und Script abbrechen
      
echo "Datenbank nicht verfügbar!";
      exit();
    }
  }
  function 
countuser()
  {
    
//hier werden wir den Benutzer zählen
    //Dazu müssen wir Ihn nur in der Datenbank eintragen
    
$qry "INSERT INTO `counter` (ip,time) VALUES (''".$this->ip."'',".$this->time.")";
    
mysql_query($qry);
    
//Schon erledigt - allerdings müssen wir noch den Cookie setzen
    
setcookie ("counter","1",$this->tomorrow);
    
//Informationen zu setcookie unter php.net/setcookie
  
}
  function 
output($type = array(''heute'',''gestern'',''woche'',''monat'',''gesamt''))
  {
    
//Ermitteln wir zunächst alle möglichen Angaben.
    //Heute - Heute, d.h. ab dem heutigen Datum um 00:00:00 Uhr
    //Wir ermitteln den Timestamp:
    
$heute mktime(0,0,0,date(''m''),date(''d''));
    
//Die Parameter von mktime sind deshalb
    //0,0,0 -> 0 Stunden, 0 Minuten, 0 Sekunden (00:00:00 Uhr)
    //date(''m''),date(''d'') -> das sind die Werte des Heutigen Tages
    //Monat,Tag | Mehr infos: php.net/mktime

    //Für Gestern rechnen wir nun einfach 24 Stunden ab
    //Da wir in Sekunden Rechnen entspricht 60*60*24 einem Tag
    
$gestern $heute 60*60*24;

    
//Nun für die Woche und den Monat
    
$woche $heute 60*60*24*7;
    
$monat $heute 60*60*24*31;

    
//Nun kommen die Werte dazu aus der Datenbank, wir werden sie in einem array speichern
    //Heute:
    
$counter[''heute''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$heute));
    
//Gestern:
    
$counter[''gestern''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` <= ".$heute." AND `time` >= ".$gestern));
    
//Woche:
    
$counter[''woche''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$woche));
    
//Monat:
    
$counter[''monat''] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$monat));
    
//Gesamt:
    
$counter[''gesamt''] = mysql_num_rows(mysql_query("SELECT * FROM `counter`"));

    
//Kommen wir nun zurück zu unserem Parameter $type der deiser Funktion übergeben wurde
    //Er enthält ein Array mit den Werten die wir haben wollen. Dies ermöglicht uns später
    //ohne aufwand, zum Beispiel nur den Wert für Heute abzufragen, ohne die Methode ändern zu müssen
    //Schreiben wir in das Array $back nun die Werte die wir möchten
    
foreach($type as $v)
    {
      
$back[$v] = $counter[$v];
    }
    
//nun können wir diese Werte zurückgeben
    
return $back;
  }
  function 
graphic()
  {
    
//Zuerst benötigen wir die werte der letzten 31 Tage
    //Da wir nicht selber 31 SQL-Abfragen schreiben wollen
    //werden wir sie in eine Schleife verfrachten
    //Doch zuerst brauchen wir den heutigen tag
    
$time mktime(0,0,0,date(''m''),date(''d''));
    
//nun werden wir die Timestamps der letzten 31 Tage in ein array schreiben
    //Achtung dieses Array fängt mit 1 An nicht mit 0. der Key 1 ist heute, 2 ist gestern usw.
    
$timestamps = array('''');
    while(
count($timestamps)<32)
    {
      
$timestamps[] = $time//Das Array ausfüllen
      
$time -= 60*60*24//Immer 1 Tag zurückrechnen
    
}
    
//gut nun haben wir das array - fehlen die Werte der Tage
    //auch das machen wir wieder in einem Array und einer Schleife
    
foreach($timestamps as $k=>$val)
    {
      if(
$k==0)
        continue;
      if(
$k==1)
        
$values[$k] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` >= ".$val));
      else
      {
        
$time2 $val 60*60*24;
        
$values[$k] = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `time` < ".$time2." AND `time` >= ".$val));
      }
    }
    
//nun haben wir die Werte der Enstprechenden Tage und können daraus eine Tabelle entstehen lassen.
    //als erstes benötigen wir die Anzahl der Zeilen - jede Zeile ist 1 Besucher
    //dazu ermitteln wir den höchsten Wert
    
$height max($values);
    
$scale 1//Maßstab ist 1 Besucher pro Zeile
    
$nheight $height;
    while(
$nheight 10//Mehr als 10 Zeilen sind unsinnig!
    
{
      
//Daher werden wir in diesem Falle den Maßstab ändern
      //Wir werden den Maßstab auf 2 Besucher pro Zeile setzen!
      
$scale++;
      
$nheight $height/$scale;
      
//Falls jetzt immernoch mehr als 50 ist, setzen wir Maßstab
      //auf 3,4,5,6,7, usw. Besucher pro Zeile
    
}
    
$height $nheight;
    
//kommen wir nun zum Erstellen der Tabelle
    //Als erstes brauchen wir das 1*1px große Bild
    
$pxbild "reddot.gif"//Pfad des Bildes relativ zur Datei, in der der Counter angezeigt wird
    //In HTML ist eine Tabelle so aufgebaut, dass wir zuerst die Zeilen und darin die Spalten
    //angeben müsssen, fangen wir also mit der Maßeinheit an!
    
$table ''<table cellpadding="0" cellspacing="0">'';
    
$table.= ''<tr>'';
    
$table.= ''<td style="vertical-align:bottom;">'';
    
$table.= ''<b>Besucher</b>'';
    
$table.= ''</td>'';
    
$table.= ''<td colspan="31" style="vertical-align:bottom;text-align:center;">'';
    
$table.= ''<b>Besucherstatistik (grafisch)</b>'';
    
$table.= ''</td>'';
    
$table.= ''</tr>'';
    
//Ab jetzt wird es schwieriger, denn wir müssen die Tabelle ab hier dynamisch generieren.
    //Dies geschieht in folgenden schleifen
    
$gone 0;
    for(
$i 0$i <= $height$i++) //schleife für Zeilen
    
{
      
$table.= ''<tr>'';
      
//oben sollte der höchste Wert stehen, also müssen wir nun die höhe mit dem
      //Maßstab verrechnen:
      
if(round(($height-$i)*$scale,0)!=0)
      {
        
$table.= ''<td style="height:20px; vertical-align:top;border-bottom:1px solid black;text-align:right;border-right:1px solid black;padding-right:2px;">'';
        
$table.= round(($height-$i)*$scale,0);
        
$table.= ''</td>'';
      }
      
//nun müssen 31 weitere spalten folgen mit den Balken.
      //Die Balken sollen jedoch durchgehend sein, und bekommen daher ein rowspan
      //Sie dürfen nur einmal angezeigt werden, d.h. es muss eine bedingung her
      
if(!$gone)
      {
        
$gone 1;
        for(
$j 31$j 0$j--)
        {
          
//hier generieren wir nun die balken, da der 31. Tag links stehen soll
          //müssen wir hier ''rückwärts'' denken
          //Wir wissen außerdem dass jede zeile 20 px hoch ist und können daher
          //errechnen wie hoch der balken sein soll
          //eine Zeile ist 20 px hoch
          //Bei einem maßstab von 1 = anzahl besucher*20
          //Bei einem maßstab von 2 = anzahl besucher*20/2
          //usw.
          
$heightofgraph $values[$j]/$scale*20+20;
     
$heightofgraph round($heightofgraph,0);
          
$widthofgraph 10//Wie breit soll ein Balken sein? 10 px dürfte ok sein
          
$colotofgraph "#54789a";
          
$table.= ''<td rowspan="''.($height+2).''" style="border-bottom:1px solid black;vertical-align:bottom;height:''.($height*20).'';width:20px;padding-left:2px;">'';
          
$table.= ''<div style="width:''.$widthofgraph.'';height:''.$heightofgraph.'';background-color:''.$colotofgraph.'';font-size:0px;">a</div>'';
          
$table.= ''</td>'';
        }
      }
      
$table.= ''</tr>'';
    }
    
//Nun haben wir unsere Tabelle fast fertig
    //Als letztes fügen wir noch die Beschriftung der Tage hinzu
    
$table.= ''<tr>'';
    
$table.= ''<td style="height:20px; vertical-align:top;border-bottom:1px solid black;border-right:1px solid black;text-align:right;padding-right:2px;">'';
    
$table.= ''0'';
    
$table.= ''</td>'';
    
$table.= ''</tr>'';
    
$table.= ''<tr>'';
    
$table.= ''<td>'';
    
$table.= ''&nbsp;'';
    
$table.= ''</td>'';
    
$table.= ''<td colspan="29" style="text-align:center;">'';
    
$table.= ''vor'';
    
$table.= ''</td>'';
    
$table.= ''</tr>'';
    
$table.= ''<tr>'';
    
$table.= ''<td style="vertical-align:bottom;">'';
    
$table.= ''&nbsp;'';
    
$table.= ''</td>'';
    for(
$k 30$k 0$k--)
    {
      
$table.= ''<td style="vertical-align:bottom;border-right:1px dotted black;padding:2px;text-align:center;">'';
      
$table.= $k;
      
$table.= ''</td>'';
    }

    
$table.= ''<td style="vertical-align:bottom;padding:2px;">'';
    
$table.= ''Heute'';
    
$table.= ''</td>'';
    
$table.= ''</tr>'';
    
$table.= ''<tr>'';
    
$table.= ''<td>'';
    
$table.= ''&nbsp;'';
    
$table.= ''</td>'';
    
$table.= ''<td colspan="29" style="text-align:center;">'';
    
$table.= ''Tagen'';
    
$table.= ''</td>'';
    
$table.= ''</tr>'';
    
$table.= ''</table>'';
    
//Unsere Tabelle ist fertig und wir können sie zurückgeben
    
return $table;
  }
}
?>


Speichert diesen Code nun in einer Datei und nennt sie counter.php

Wie wird der Counter nun Benutzt?

Das geht nun relativ einfach.
Auf jeder Seite, die beim Zählen der Benutzer berücksichtigt werden soll, kommt folgender Code ganz an den Anfang eurer Seite. Vor diesem Code darf keine Ausgabe stattgefunden haben - Achtung also bei Includes.

<?php
include("counter.php"); //In dieser Datei befindet sich die Klasse Counter
$counter = new Counter();
?>


Die normale Ausgabe der Zahlen erfolgt nun über die Methode "output".
Diese gibt euch alle Werte zurück, oder auch nur die, die Ihr bekommen möchtet.
Den Code schreibt ihr dort, wo ihr die Ausgabe haben wollt:

<?php
$countdata 
$counter->output(); //Alle Daten bekommen
echo "Heute: ".$countdata["heute"]; //Heute
echo "Gestern: ".$countdata["gestern"]; //Gestern
echo "Woche: ".$countdata["woche"]; //Woche
echo "Monat: ".$countdata["monat"]; //Monat
echo "Gesamt: ".$countdata["gesamt"]; //Gesamt

// Solltet ihr aber nur die Werte Heute und Gestern benötigen
// Reicht folgender Code aus:
$countdata $counter->output(array(''heute'',''gestern'')); //Alle Daten bekommen
echo "Heute: ".$countdata["heute"]; //Heute
echo "Gestern: ".$countdata["gestern"]; //Gestern
?>


Die grfische Ausgabe erreicht ihr noch einfacher

<?php
echo $counter->graphic(); //Grafik anzeigen
?>


Beispielstatistik

Wenn ihr alles richtig gemacht habt, und der Counter eine weile lief, kann das Ergebnis z.b. so aussehen:


Ende

Ich kann euch nur beglückwünschen. Ihr habt das Komplette Tutorial durchgehalten und habt nun einen ganz besonderen Counter auf eurer Homepage
Ich hoffe es hat euch gefallen und ihr habt zumindest etwas gelernt.
Ich bitte um viel konstruktive Kritik für dieses, mein erstes, Tutorial, damit ich mich bessern kann.

Mit freundlichen Grüßen Ch3ck3r

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von I3uLL3t
  • 21.10.2011 - 00:05

Sehr gut geschrieben und nachvollziehbar

Portrait von LutzR01
  • 23.01.2011 - 19:23

Dein Tut ist wirklich gut geschrieben. Bin auch, bis auf Kleinigkeiten, gut damit klargekommen. Aber warum hörst Du mitten in der grafischen Ausgabe auf es zu vollenden? Als "Statistikbalken" stehen natürlich nur kleine 'a' da. Du definierst eine Variable $pxbild='reddot.gif', verwendet wird dies jedoch an keiner Stelle Deines Quelltextes. Ist das nur bei mir so, habe ich etwas übersehen oder fehlt dieser Teil tatsächlich.

Portrait von Rena_63
  • 07.12.2010 - 19:49

Ich denke, damit kann ich etwas anfangen. Bin noch neu in dem Thema, aber die Erklärung sieht sehr übersichtlich und schlüssig aus.
Vielen Dank im voraus.

Portrait von frank070365
  • 24.09.2010 - 08:40

Gut erklärt, Danke. Hat mir sehr geholfen

Portrait von Supersuzi
  • 13.09.2010 - 08:17

Klasse erklärt, Danke

Portrait von Franzi_Jump
  • 25.06.2010 - 11:47

gutes Tutorial... danke auch für die ausführliche Doku ... :)

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 19.01.2010 - 21:52

Sehr ausführliches Tutorial.
Wird direkt morgen ausprobiert.
Danke schon mal;)

Portrait von icehawk2
  • 17.01.2010 - 17:20

werde mir das mal bei gelegenheit genauer ansehen. . . ABer bedanke mich schonmal für das Tut ich hoffe ich kann damit was anfangen. . .

Portrait von Eydamos
  • 15.04.2009 - 21:06

Schönes Script, aber nur 3 Sterne, da er 2 Fehler und einen Schöhnheitsfehler hat.

Fehler 1: An vielen stellen steht '' hier darf aber nur ein ' stehen oder ein "
Fehler 2: Es wird echo statt print verwendet, das ist schlecht für die Performance

Schöhnheistfehler:
bei error_reporting(E_ALL | E_STRICT); bekommt man eine Fehlermeldung da die Zeitzone nicht gesetzt ist, wenn man am Anfang der Datei die Zeile:
date_default_timezone_set('Europe/Paris');
einfügt gibt es diesen Fehler nicht mehr.

Portrait von kaltestantchen
  • 08.02.2009 - 14:21

Wow, etwas viel auf ein mal .
Gut erklärt, sehr bunt.
Die länge schreckt etwas ab.

Portrait von schorsch8
  • 15.01.2009 - 02:05

ich bekomme ne fehlermeldung und zwar hier

$this->tomorrow = mktime(23,59,59,date(''m''),(date(''d'')-1)); //24 Stunden vorrechnen


was kann das sein?

Portrait von Top_Gun
  • 14.04.2009 - 14:48

Da fehlt eine schließende Klammer

Portrait von schorsch8
  • 14.05.2009 - 14:12

wo fehlt die klammer?

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 09.10.2008 - 12:25

lang aber gut erklärt!

Portrait von cibox
  • 22.03.2008 - 23:28

Alles super erklärt, und sehr ausführlich beschrieben. Ein sehr gutes Tutorial was ich gleich mal ausprobieren werde.

THX !!

Portrait von cibox
  • 25.03.2008 - 12:51

Ich habe das Tutorial so übernommen, und auf dem Server läuft PHP 5.1.6 - leider gibt er mir gleich am Anfang schon einen Fehler aus:

Fehler: Parse error: syntax error, unexpected T_STRING in /var/www/html/web948/html/test/counter.php on line 20

Zeile 20: $this->today = mktime(0,0,1,date(''m''),date(''d'')); //24 Stunden vorrechnen

Portrait von Naveh
  • 01.03.2008 - 08:52

Perfekt genauso wie ich es haben will ! Danke !

Portrait von Kampfrolli
  • 19.02.2008 - 09:41

Hi
Ich suche mir einen Wolf wo es hilfen gibt sowas zu erstellen und hier werde ich prompt fündig. Vielen dank

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 21.07.2007 - 12:28

top 1. sahne, mit das beste was ich hier kenne

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 17.07.2007 - 14:25

Da wird man so richtig mit Daten erschlagen. Vielleicht etwas zu viel des Guten?

x
×
×