Willkommen zu meinem Tutorial

Vorwort:
Ich möchte hier kein Zähler machen der zählt wieviel mal eine Seite schon aufgerufen wurde sondern ich möchte Zählen wie viele Besucher wirklich da waren.
Dazu müssen wir etwas abspeichern was jeder Besucher zurück lässt, und ihn so wieder erkennen kann.

Eine Möglichkeit wäre Cookies zu setzten, eine andere wäre die IP-Adressen abzuspeichern.

Grundstätzlich wäre Beides Möglich

Mit Cookies kann man aber leichter die Zeit einstellen nachdem ein Besuch wieder gezählt wird.
Ein Nachteil ist, dass man die Cookies (mit PHP) am Anfang des Dokuments setzten muss.
(dh. bevor etwas mit "echo" oder Ähnliches ausgegeben wurde).

Cookies setzt man so:
PHP-Code:

setcookie("Name","Inhalt","Ablaufdatum");
setcookie("counter", 1 ,time()+60*60);
//Dieses Cookie überlebt höchstens 1 Stunde
//time()+60*60*24 wäre ein Tag






Wenn man die IP's abspeichert, hat man zwar mehr Daten auf dem eigenen Webspace , doch dass ist eine kompatibelere Version, weil man Cookies ausschalten kann. Ich meine jetz nicht, dass man die IP nicht ändern kann, oder sie nicht verstecken kann.

die IP kriegt man so herraus:
PHP-Code:

$_SERVER['REMOTE_ADDR'] ;



Die IP des Besuchers wird automatisch darin gespeichert.


Besucherzähler mit Cookies


Vorüberlegungen:
Jedes mal wenn die Seite geladen wird, wird geprüft ob das Cookie nicht schon da ist. Wenn nein wird das Cookie gesetzt und die Zahl in der Datei, die die Besucherzahl beinhaltet, wird um 1 erhöht.
Die Zahl wird auf Beide fälle ausgelesen.

Skripte

Skript um eine Datei auszulesen:
PHP-Code:

<?php

$datei 
"Besucher.txt";
//PFAD ZUR DATEI

$handle fopen$datei"r");
// Die Datei wird geöffnet
$inhalt fread$handlefilesize($datei));
//Die gesamte Datei wird ausgelesen und in $inhalt gespeichert
fclose($handle);
//Die Datei wird geschlossen

echo $inhalt;
//Inhalt wird ausgegeben
?>




Wenn dieses Skript und die Datei im Gleichen Verzeichnis(Ordner) sind, und das Skript ausgeführt wird, wird der Ganze inhalt ausgegeben.
zB Wenn in der Datei Besucher "6" steht wird auch "6" ausgegeben

So jetz hängen wir noch ein Teil an damit die Zahl auch erhöht wird:(hitzähler)

PHP-Code:

<?php
$datei 
"Besucher.txt";
//PFAD ZUR DATEI

$handle fopen$datei"r");
// Die Datei wird geöffnet im Modus "r" = read = lesen
$inhalt fread$handlefilesize($datei));
//Die gesamte Datei wird ausgelesen und in $inhalt gespeichert
fclose($handle);
//Die Datei wird geschlossen

$inhalt++;
//inhalt wird um 1 erhöht

echo $inhalt;
//Inhalt wird ausgegeben

$handle fopen$datei"w");
//Die Datei wird geöffnet um Modus "w" = write = schreiben (=Überscheiben)
fwrite($handle$inhalt);
//Die Neue Zahl wird hineingeschrieben
fclose($handle);
//Die Datei wird geschlossen
?>




So jetzt müssen wir das erhöhen nur ausführen wenn kein Cookie existiert. Und ein Cookie machen wenn es keines gibt.

PHP-Code:

<?php
$datei 
"Besucher.txt";
//PFAD ZUR DATEI

$handle fopen$datei"r");
// Die Datei wird geöffnet im Modus "r" = read = lesen
$inhalt fread$handlefilesize($datei));
//Die gesamte Datei wird ausgelesen und in $inhalt gespeichert
fclose($handle);
//Die Datei wird geschlossen


if(isset( $_COOKIE['count']) != TRUE)
{
//Wenn Cookie 'count' >nicht< gesetzt
    
setcookie('count''1' time()+60*60*6);
    
//Cookie wird gessetzt

    
$inhalt++;
    
//inhalt wird um 1 erhöht
    
$handle fopen$datei"w");
    
//Die Datei wird geöffnet um Modus "w" = write = schreiben (=Überscheiben)
    
fwrite($handle$inhalt);
    
//Die Neue Zahl wird hineingeschrieben
    
fclose($handle);
    
//Die Datei wird geschlossen
}

echo 
$inhalt;
//Inhalt wird ausgegeben
?>




Das "time()+60*60*6" von "setcookie('count', '1' , time()+60*60*6);" bedeutet, dass das Cookie maximal 6 Stunden lebt. Wenn also ein Besucher um 09:06 die Seite zum ersten mal Besucht, und diese um 15:13 wieder Besucht ist die Besucherzahl wegen dem gleichen Besucher 2 mal erhöht worden.
Darum kann man das auch erhöhen oder senken wie man will, ein Monat wäre zB "time()*60*60*24*30"

Das Ganze funktioniert aber nicht immer wie gewünscht, es gibt immer wieder Besucher die Cookies ausgeschalten haben oder diese Selber Löschen. Wenn nun ein Besucher Cookies gar nicht zulässt wird der Zähler bei jedem Laden um 1 erhöht >-<. In deser Ansicht ist die Lösung mit der IP speichern besser.

Kommen wir zur Möglichkeit mit den IPs Speichern.

WICHTIG: Vor der Zeile "setcookie('count', '1' , time()+60*60*6);" darf KEIN "echo" stehen oder Sonstige html-tags!
Bevor ihr das Skript ausführt solltet ihr die Datei "Besucher.txt" anlegen und "0" hineinschreiben sonst wird es Fehlermeldungen geben und nicht funktionieren.



Besucherzähler mit IP abspeichern

Vorüberlegungen
Jedes mal wenn die Seite geladen wird, eine Datei ausgelesen und man vergleicht ob die neue IP mit einer in der Datei übereinstimmen. Wenn nein, wird die Neue IP und das Datum hinzugefügt, und in einer Andern Datei die Zahl um 1 erhöht. Der Inhalt der Datei mit der Zahl wird angezeigt.


Skripte
Wir gehen vom einfachen Hitzähler aus:
PHP-Code:

<?php
$datei 
"Besucher.txt";
//PFAD ZUR ZAHL DATEI

$handle fopen$datei"r");
// Die Datei wird geöffnet im Modus "r" = read = lesen
$inhalt fread$handlefilesize($datei));
//Die gesamte Datei wird ausgelesen und in $inhalt gespeichert
fclose($handle);
//Die Datei wird geschlossen

$inhalt++;
//inhalt wird um 1 erhöht
echo $inhalt;
//Inhalt wird ausgegeben

$handle fopen$datei"w");
//Die Datei wird geöffnet um Modus "w" = write = schreiben (=Überscheiben)
fwrite($handle$inhalt);
//Die Neue Zahl wird hineingeschrieben
fclose($handle);
//Die Datei wird geschlossen
?>




Jetzt brauchen wir eine zweite Datei (IP.txt) in der alle IPs gepeichert werden.
PHP-Code:

<?php

$idatei 
'IP.txt';
//PFAD ZUR IP DATEI

$yip  $_SERVER['REMOTE_ADDR'];
//IP WIRD ERFASST

$handle fopen$idatei"a" );
//Die IP Datei wird geöffnet um Modus "a" = append = anfügen
fwrite$handle$yip."|");
//An die IP Datei wird die IP und "|" angehängt
//Wird Als Trennzeichenbenötigt
fclose$handle );


?>




Damit haben wir alle IPs in einer Datei... ja aber auch nicht mehr ^^
Jetzt muss noch überprüft werden ob die IP nicht schon vorhanden ist. Aber es Soll auch noch eine Funktion geben die "Alte" IPs löscht, damit spart man auch Speicherplatz.

Das fertige Skript:
PHP-Code:

<?php
$datei  
'Besucher.txt';
//PFAD ZUR ZAHL DATEI
$idatei 'IP.txt';
//PFAD ZUR IP DATEI
$yip  $_SERVER['REMOTE_ADDR'];
//IP WIRD ERFASST
$lebensdauer 60*60*6;
$jetzt time();
$datum $jetzt $lebensdauer;

$handle fopen$datei"r");
// Die Zahl Datei wird geöffnet im Modus "r" = read = lesen
$inhalt fread$handlefilesize($datei) );
//Die gesamte Zahl Datei wird ausgelesen und in $inhalt gespeichert
fclose$handle );
//Die Zahl Datei wird geschlossen

echo $inhalt;
//BESUCHER ZAHL WIRD AUSGEGEBEN

$handle fopen$idatei"r");
// Die IP Datei wird geöffnet

if(filesize($idatei) > 0)
{
    
$size filesize($idatei);
}
else
{
    
$size 1;
}
//Macht das die grösse der Datei nie 0 ist
//Verhindert ERROR

$ips    fread$handle$size );
// Die gesamte IP Datei wird ausgelesen und in $ips gespeichert
fclose$handle );
//Die IP Datei wird geschlossen

$ips substr($ips0strlen($ips)-1);
//Das Letzte Zeichen wird abgetrennt
//Ist immer ein | , hilt gg Fehler
$ips explode("|"$ips);
//Wird aufgespalten in einen Array alle "|" allen weg
//in einem index steht zb 122.34.67.23+12341423 oder ähnliches
$anzahl count($ips);
//Anzahl IP Adressen werden gezählt
$check 1;
$newstring "";
echo 
"<br/><br/>";
for(
$x 0$x<$anzahl $x++)
{
//Die Schleife läuft genausoviel mal durch wie es IPs gibt
    
$ips[$x] = explode("+"$ips[$x]);
    
//Jeder index wird gespalten alle + fallen weg
    //Es entsteht ein 2 dimensionales Array
    //in $ips[2][0] ist eine IP
    //in $ips[2][1] ist ein timestamp
    
if($ips[$x][1] == "")
    {
        
$ips[$x][1] = 0;
    }
    
//Wenn keine zeit angegeben ist ist die Zeit 0 damit der Eintrag gelöscht wird

    
if($ips[$x][1] > $jetzt)
    {
        
$newstring $newstring."".$ips[$x][0]."+".$ips[$x][1]."|";
    }
    
//Abgelaufene IPs werden >nicht< in $newstring aufgenommen

    
if($ips[$x][0]== $yip)
    {
        
$check 0;
    }
    
//Prüft ob die IP mit der jetzigen übereinstimmt
}
/*
echo "<pre>";
print_r($ips);
print_r($newstring);
echo "</pre>";
//NIMM DEN KOMMENTAR WEG UM ZU SEHEN WAS GESCHIEHT
*/

$handle fopen$idatei"w" );
//Die IP Datei wird geöffnet um Modus "w" = write = schreiben
fwrite$handle$newstring );
//Schreibt alle >nicht< abgelaufenen IPs wieder in die Datei
fclose$handle );
if(
$check == 1)

{
// WENN DIE IP NICHT GEFUNDEN WURDE

    
$handle fopen$idatei"a" );
    
//Die IP Datei wird geöffnet um Modus "a" = append = anfügen
    
fwrite$handle$yip."+".$datum."|");
    
//An die IP Datei wird die IP und "|" angehängt + das Ablaufdatum
    //Wird Als Trennzeichenbenötigt
    
fclose$handle );

    
$inhalt++;
    
//inhalt wird um 1 erhöht

    
$handle fopen$datei"w");
    
//Die Zahl Datei wird geöffnet um Modus "w" = write = schreiben (=Überscheiben)
    
fwrite($handle$inhalt);
    
//Die Neue Zahl wird hineingeschrieben
    
fclose($handle);
    
//Die Zahl Datei wird geschlossen
}


?>





Dieses Skript macht Folgendes:
Es liest die Datei "IP.txt" aus
Inhalt von IP.txt hat folgendes geschrieben:

123.63.12.15+1268508509|44.23.155.254+1268508509|56.43.123.112+1268508509|


Davon wird nun das letzte Zeichen abgehackt
Inhalt von $ips hat folgendes geschrieben:

123.63.12.15+1268501324|44.23.155.254+1268508509|56.43.123.112+1268515342


Das ganze wird nun am Zeichen "|" zerlegt. So haben wir die IP und deren Ablaufdatum in einem Index vom Array $ips

Inhalt von $ips(1) hat folgendes geschrieben:

44.23.155.254+1268508509


In der for schleife werden nun die einzelnen Indexe aufgespalten. Es Entsteht ein 2 dimensionales Array.

Inhalt von $ips(1)(0) hat folgendes geschrieben:

44.23.155.254


Inhalt von $ips(1)(1) hat folgendes geschrieben:

1268508509


(Die Klammern [ und ] gehen nicht weil das zwischen "[quote=" und "]" stehen soll.)

Jetzt wird geprüft ob Das Ablauf Datum grösser ist als das jetzige Datum. Wenn ja wird IP+Zeit $newstring angefügt.

Wenn nun die IP des Besuchers mit einer der IPs übereinstimmt wird die Variable $check auf 0 gesetzt.

Jetzt sind alle Schleifendurchgänge Vorrüber und es kann weitergehen.
In die IP Datei werden alle IPs hineingeschrieben (alles alte wird überschrieben) die noch nicht abgelaufen sind.

Wenn $check jetz nicht 0 ist, wird die IP des Besuchers + das Ablaufdatum zur IP Datei hinzugefügt und die Zahl in der Besucher Datei wird um 1 erhöht.


In diesem Skript überlebt eine IP etwa 6 Stunden. (Die IP kann nur gelöscht werden, wenn das Ablaufdatum vorbei ist und das Skript auch ausgeführt wird). Will man das ändern muss man einfach den Inhalt von $lebensdauer ändern. 60*60*24*30 ist zB ein Monat.

Dieses Zählsystem lässt sich nicht ganz so kaputt machen wie bei den Cookies. Aber es gibt durchaus Möglichkeiten, mehrmals innerhalb der Ablaufszeit gezählt zu werden. zB wenn mein Seine IP versteckt oder ändert (zB Router Neustart).



WICHTIG:
Bevor ihr das Skript ausführt solltet ihr die Dateien "Besucher.txt" und "IP.txt" anlegen und bei Besucher.txt" "0" hineinschreiben sonst wird es Fehlermeldungen geben und nicht funktionieren.



Ich hoffe Euch hat das Tutorial geholfen.

mfg
Mogria


PS: Wenn ihr einen Super Zähler wollt indem Beide Möglichkeiten Kombiniert sind dann sagt es mir ^^.