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 = "manfred"; //Euer MySQL-Benutzername
$this->mysqlpass = "magellan"; //Euer MySQL-Passwort
$this->mysqldatabase = "systems"; //Eure MySQL-Datenbank
$this->mysqlconnect("localhost", "trallala", "trallala"); //bauen wir eine MySQL Verbindung auf
// mysql_connect("localhost", "manfred","magellan")or die ("Verbindung fehlgeschlagen<br />");// Verbindung zur Datenbank
//mysql_select_db(systems) or die ("Keine Datenbank mit angegebenen Namen vorhanden<br />");
//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
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.
*/
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.= ' ';
$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.= ' ';
$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.= ' ';
$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;
}