Bitte! Erklärung zu diesem Script

Hallo.
Ich habe folgendes Counter-Scipt, das Script funktioniert wohl auch prima. Nun verstehe ich nicht sehr viel von PHP und möchte dieses Script auf eine Homepage einbauen. Aber bevor ich das mache möchte ich genau wissen wie dieses Script funktioniert.
Besonders möchte ich wissen was in dieser Zeile die 20 bedeutet?
$line=fgets($handle,20);

Kann mir jemand eine Erklärung liefern?
Ich bedanke mich schon im Voraus.

Hier das Script:

// Configuration
$dataFile=„count.dat“;
// Set the localtion of the datafile
$outStringFormat=„Sie sind der [COUNTER]. Besucher.“;
// Use the variable „[COUNTER]“ for the number of visit
$useIpLocking=true;
// Set ‚false‘ if you don’t want to use ip-locking

// Try to open data-file
$handle=@fopen($dataFile,„r“);
if ($handle)
{
// Read number of vistors and last ip
$line=fgets($handle,20);
$tmpArray=explode(";",$line);
$cnt=$tmpArray[0];
$ip=$tmpArray[1];
fclose($handle);
}
else $cnt=0;

// Count up if last ip is different to the user’s ip
if ($ip!=$REMOTE_ADDR||!$useIpLocking) $cnt++;

printf("%s",str_replace("[COUNTER]",$cnt,$outStringFormat));

$tmpArray[0]=$cnt;
$tmpArray[1]=$REMOTE_ADDR;
$line=implode(";",$tmpArray);
$handle=fopen($dataFile,„w“);
fputs($handle,$line);
fclose ($handle);
?>

Hallo.

Hallo CaFe

möchte ich genau wissen wie dieses Script
funktioniert.

Leider habe ich keine Zeit dir alles zu erklären, ich rate dir ein Tutorium für PHP durchzuarbeiten.

Besonders möchte ich wissen was in dieser Zeile die 20
bedeutet?
$line=fgets($handle,20);

fgets behandelt zwei parameter, der erst ist der datei handle und der zweite ist der length paremeter.

hier die beschreibung aus der php doku:

Reading ends when length - 1 bytes have been read, on a newline (which is included in the return value), or on EOF (whichever comes first). If no length is specified, it will keep reading from the stream until it reaches the end of the line.

Hallo.

ich rate dir ein Tutorium für PHP durchzuarbeiten.

das werde ich tun

Reading ends when length - 1 bytes have been read, on a
newline (which is included in the return value), or on EOF
(whichever comes first). If no length is specified, it will
keep reading from the stream until it reaches the end of the
line.

ohjee… das verstehe ich noch weniger ,-)
aber trotzdem danke und noch einen schönen Tag!

Reading ends when length - 1 bytes have been read, on a
newline (which is included in the return value), or on EOF
(whichever comes first). If no length is specified, it will
keep reading from the stream until it reaches the end of the
line.

ohjee… das verstehe ich noch weniger ,-)
aber trotzdem danke und noch einen schönen Tag!

Das ganze gibt’s auch auf deutsch:

Gibt eine Zeile bis zu length -1 Bytes Länge zurück, welche aus der Datei von der aktuellen Position des Dateizeigers handle aus ausgelesen wird. Die Zeile endet an einem Zeilenumbruch (welcher im Rückgabewert enthalten ist), EOF (Ende der Datei) oder bei length - 1 Bytes (je nachdem, was eher auftritt). Ist keine Länge angegeben, wird diese auf 1k bzw. 1024 Bytes gesetzt.

Nachzulesen im PHP Handbuch: http://de3.php.net/fgets

Grob uebersetzt:
der 2. Parameter gibt einen String in der angegebenen Laenge minus 1 Byte zurueck. Wenn davor jedoch ein Newline (\n) oder ein Dateiende (EOF) vorkommt, dann nur bis zu diesem.

Gruss
Stefan

1 Like

// Configuration

Erstmal nehmen wir eine speicherschublade nennen diese
dataFile , dort packen wir count.dat rein.

$dataFile=„count.dat“;
// Set the localtion of the datafile

wir nehmen eine speicherschublade nennen diese outStringFormat
und packen dort rein : Sie sind der
[COUNTER]. Besucher.

$outStringFormat=„Sie sind der [COUNTER].
Besucher.“;
// Use the variable „[COUNTER]“ for the number of visit

wir nehmen eine speicherschublade nennen diese useIpLocking
dort packen wir rein : true

$useIpLocking=true;

wenn du kein IP lookup (IP des aufrufers nachgugen) haben
möchtest musst du : false : da rein packen

// Set ‚false‘ if you don’t want to use ip-locking

// Try to open data-file

Hier wird versucht die Datei zu öffnen.

fopen ist der befehl zum öffnen ,
die klammer verdeutlicht das dieser befehl noch einige angaben
braucht.
der name der datei ist in der speicherschublade mit dem namen
dataFile

das „r“ steht für read , ergo lesen

fopen mcht daraus öffne datei count.dat zum lesen

um nun mit der geöffneten datei weiter was tun zu können,
nehmen wir noch eine speicherschublade namens handle und
packen dort diese geöffnete datei rein .

$handle=@fopen($dataFile,„r“);

if = fals

also hier kommt eine prüfung

fals handle vorhanden

if ($handle)
{

tu dies -->>

// Read number of vistors and last ip

fegt is der befehl der wissen muss welche datei und
wieviel es tun soll
fget hat die funktion zeichen zu holen , also sagen wir
fget in der klammer welche datei , das wäre $handle , und
wieviele zeichen gelesen werden sollen , dat wären 20 . das
ergebniss (also die 20 zeichen ) bewahren wir in der
speicherschublade mit namen line auf.

$line=fgets($handle,20);

so nun haben wir 20 zeichen , man muss wissen das in den 20
zeichen Semikolons genutzt werden um die informationen zu
trennen . Z.B. Vorname;Namchname , was dann zu Rakon;Dark
führt.
Hier allerding

zählerstand;ipdesbesuchers

explode ist nun ein befehl der genau an den Semikolons diese
20 Zeichen zerschneidet und in einzelne Speicherschubladen
packen kann.

explode nimmt also die zeichen aus schublade line und
schneidet mit hilfe vom „;“ das in stücke.

diese Stücke werden in der speicherschublade tmpArray
aufbewahrt.
das tolle tmpArray ist eine schublade mit schubladen drinne

-)

so kann ich alle stücke mit ein und demselben schubladen namen
holen.

$tmpArray=explode(";",$line);

hier wird nun in die schublade cnt der inhalt der erste
schublade in der schublade tmpArray genommen. Beim obrigen
beispiel z.b. Rakon. bzw Zählerstand

ein computer beginnt bei 0 zu zählen , nicht bei 1 :smile:

Ein Kind ist ja auch nach der geburt 0 Jahre alt und nicht 1
Jahr :smile:

$cnt=$tmpArray[0];

hier wird nun in schublade ip der inhalt der 2ten schublade
(0=1 schub, 1=2 schub,…) von tmpArray gepackt.

$ip=$tmpArray[1];

fclose schliesst nun die datei

fclose($handle);

}

ansonsten tu das -->>
pacj in schublade cnt den wert 0

else $cnt=0;

hier wird nun geschaut ob die IP des jetzigen besuchers mit
der des letzten eintrages in der datei ist.

// Count up if last ip is different to the user’s ip

fals inhalt ip ungleich IP des jetzigen webbesuchers
oder
useIpLocking gleich false
erhöhe den Inhalt cnt (welches wohl das letzte zähler ergebnis
ist)

soll heissen, nur wenn IP logging abgeschaltet bzw die letzte
ip anders ist als die jetzige wird gezählt. Ansonsten wird
nicht gezählt, weil logging ein und dann noch die ip anders
sein muss.

if ($ip!=$REMOTE_ADDR||!$useIpLocking) $cnt++;

um das ganze nun auszugeben wird printf genutzt

das brauch eine FORMAT string „%s“ ich brauch nur zeichen vom
nachfolgenden.
str_replace ersetzt nun alle zeichen [COUNTER] in schublade
outStringFormat und packt statdessen den inhalt von schublade
cnt rein.

ergo wird [COUNTER] mit dem aktuellen zählerwert getauscht.

und dann ausgeben

printf("%s",str_replace("[COUNTER]",$cnt,$outStringFormat));

nun wird noch mal eben in die erste und zweite schublade der
aktuelle zählerwert und die aktuelle IP des besuchers
gespeichert.

$tmpArray[0]=$cnt;
$tmpArray[1]=$REMOTE_ADDR;

implode macht nun das gegenteil wie explode

es nimmt alle schubladen aus tmpArray und packt sie
hintereinader mit jeweils einem semikolon dazwischen.

$line=implode(";",$tmpArray);

hier wie oben, datei öffnen nun aber mit „w“ für write =
schreiben

$handle=fopen($dataFile,„w“);

wie fget nur fput packt die daten in die datei , hier das
ergebnis der implosion die ja in line abgelegt wurde.

fputs($handle,$line);

datei wirder schliessen , fertich.

fclose ($handle);
?>

so un nun die schlechte nachricht, wenn 2 user
unterschiedlicher IP immerwieder klicken, erhöht sich der
zähler , weil ja immer nur die letzte IP in der datei
gespeichert werden.

Das ding ist also nur gut um zu zählen wie offt eine seite
aufgerufen wurde. Auf die anzahl der tatsächlichen besucher zu
schliessen ist auch mit IP logging nicht möglich.

Also es zählt halt, sobald die seite geöffnet wurde. Mehr und
weniger tut es nicht.

Ich hoffe das reicht zum verständiss.

Hallo!

Vielen herzlichen Dank für diese ausführliche Erklärung.
Ich habe gemerkt, dass der Zähler eins hochzählt sobald der User wechselt, also sobald sich die IP ändert.
Aber weil ja wohl die IP eines Rechners nicht statisch ist, also sie ändert sich ja bei jedem neuen Seitenaufruf, ist das sicher ok so.
Ob die 20 Zeichen, die ausgelesen werden, reichen?
In der count.dat steht immer der momentane Zählerstand und die letzte IP.
Das sind ja eigentlich nicht mehr als 20 Zeichen…

Vielleicht ist es realistischer einen Counter einzusezten der eine Zeitsperre hat.

Also nochmals vielen Dank für die Hilfe, und noch einen schönen Tag!

Hallo.
Vielen Dank für den Link, ist schon in meinen Fav. hinterlegt, vielleicht kann ich echt noch ein wenig dazulernen… php scheint ja nicht so leicht zu sein.

Ich wünsche noch einen schönen Tag.

LG

Hallo!

Vielen herzlichen Dank für diese ausführliche Erklärung.
Ich habe gemerkt, dass der Zähler eins hochzählt sobald der
User wechselt, also sobald sich die IP ändert.
Aber weil ja wohl die IP eines Rechners nicht statisch ist,
also sie ändert sich ja bei jedem neuen Seitenaufruf, ist das
sicher ok so.

Nein eine IP ändert sich erst wenn der user sich neu einwählt ins internet bzw den router resetet oder meist nach 24 stunden.

Aber sobald 2 User im selben zeitraum immerwieder die seite neu laden, wird dein zähler hochgedrückt, obwohl es nur 2 besucher waren.
Ergo das aufrufen der seite wird richtig gezählt. Das mit dem IP logging würde erst funktionieren wenn alle z.b. Heutigen IP’s eingetragen werden oder mit Zeitstempel . Aber er soll ja nur zählen :smile: Und das mit der IP ist eh so ein Problem :smile: