ubuntuusers.de

PHP Besucherzähler geht nicht

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

pemibo

Avatar von pemibo

Anmeldungsdatum:
2. Juni 2006

Beiträge: 108

Hallo, kann mir jemand sagen warum dieser Besucherzähler nicht geht?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
$speicher="besuchernr.txt";
$besuchernr;
if(file_exists($speicher)){
	$zaehler=fopen("besuchernr.txt","r");
	$besuchernr=fgets($zaehler, 255);
	fclose($zaehler);
	$besuchernr++;
}
$zaehler=fopen("besuchernr.txt","w");
if($zaehler){
	fputs($zaehler, $besuchernr);
	flcose($zaehler);
}
echo "Seitenaufruf Nr. $besuchernr";
?>

Das Problem ist wohl, dass er die Variable $besuchernr nicht erhöht. Hab schon soviel rumprobiert.

Vielen Dank schon mal

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

„Nicht gehen“ heißt was? Der Fehler, den Du nicht näher erläuterst, kann alle möglichen Gründe haben, angefangen von Fehlkonfigurationen im Server bis hin zu fehlenden Rechten für das Verzeichnis, in dem dieses Skript ausgeführt wird.

Im Allgemeinen aber implementiert man Besucherzähler so nicht. Ganz abgesehen von allen möglichen Probleme, die es mit sich bringen kann, wenn man in das Dateisystem des Servers schreiben möchte, ist dieser Zähler vor allem broken by design, da das Lesen und Schreiben des Zählers nicht atomar geschieht.

pemibo

(Themenstarter)
Avatar von pemibo

Anmeldungsdatum:
2. Juni 2006

Beiträge: 108

Okay, dann will ichs mal ein bisschen weiter erläutern. Der Code so wie er hier steht (übrigens aus einem Buch 😉 ) gibt mir immer nur die Zahl aus die ich in die Datei besuchernr.txt schreibe aber er erhöht sie nicht. An der Stelle an der er die Besuchernummer erhöhen soll, ($besuchernr++😉 geschieht einfach nichts. Das ist mir sehr unverständlich. Auslesen tut er sie richtig.

Danke

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Das klingt stark nach einem Rechteproblem. Darf der Benutzer, unter welchem der Webserver läuft, diese Datei denn schreiben?

Die Tatsache, dass der Quelltext aus einem Buch ist, macht ihn nicht besser, im Gegenteil, sie wirft ein äußerst schlechtes Licht auf das Buch. ☺ Ist das gesamte Buch von der Qualität dieses Quelltexts, dann ist es das Papier nicht wert, auf dem es gedruckt wurde.

Die fehlende Atomarität ist ja nicht das einzige Problem. Die Fehlersuche gestaltet sich ja nichtzuletzt deswegen so schwer, weil dem Skript jedwede Art von Fehlerbehandlung fehlt. Deswegen erkennt es auch Probleme beim Schreiben nicht.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21815

Wohnort: Lorchhausen im schönen Rheingau

Nebenbei hat Zeile 13 einen Fehler. Wenn es hier ein TYPO ist, kein Problem. Wenn es ein TYPO im Quellcode ist, fix das mal.

pemibo

(Themenstarter)
Avatar von pemibo

Anmeldungsdatum:
2. Juni 2006

Beiträge: 108

Ich glaube nicht, dass es am schreiben der Datei liegt. Wenn ich nämlich vor und nach dem $besuchernr++; den Wert mit print($besuchernr); ausgebe erhalte ich immer den selben Wert. Also wird er ja gar ned erhöht oder? Danke für die schnellen Antworten.

PS: Ich glaub ich muss mir ein anderes Buch kaufen 😢

YEPHENAS

Anmeldungsdatum:
8. Juni 2009

Beiträge: 352

pemibo schrieb:

Okay, dann will ichs mal ein bisschen weiter erläutern. Der Code so wie er hier steht (übrigens aus einem Buch 😉 )

Au weia

gibt mir immer nur die Zahl aus die ich in die Datei besuchernr.txt schreibe aber er erhöht sie nicht. An der Stelle an der er die Besuchernummer erhöhen soll, ($besuchernr++😉 geschieht einfach nichts. Das ist mir sehr unverständlich. Auslesen tut er sie richtig.

Du inkrementierst einen String. PHP ist zwar schwach typisiert und konvertiert frei Schnauze zwischen Typen hin und her, aber sobald sich in dem String nach den Ziffern weitere Zeichen befinden (z.B. Leerzeichen oder ein Zeilenumbruch) wird der String nicht mehr in einen Integer umgewandelt und folglich nicht mehr inkrementiert.

YEPHENAS

Anmeldungsdatum:
8. Juni 2009

Beiträge: 352

Lunar schrieb:

Im Allgemeinen aber implementiert man Besucherzähler so nicht. Ganz abgesehen von allen möglichen Probleme, die es mit sich bringen kann, wenn man in das Dateisystem des Servers schreiben möchte, ist dieser Zähler vor allem broken by design, da das Lesen und Schreiben des Zählers nicht atomar geschieht.

Für eine Personal Homepage, die zwei- bis dreimal im Jahr aufgerufen wird kein Problem.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@YEPHENAS: Es macht die Lösung nicht besser, wenn sie nur auf einer Seite ohne Besucher läuft ☺

pemibo

(Themenstarter)
Avatar von pemibo

Anmeldungsdatum:
2. Juni 2006

Beiträge: 108

Also das mit dem Leerzeichen oder Zeilenumbruch klingt zwar plausibel aber das scheint auch keine Lösung zu sein. Ich hab die Datei jetzt schon mehrmals mit gedit erstellt und immer nur eine einstellige Zahl hineingeschrieben. Ohne Leerzeichen oder Zeilenumbrüche. Wie kann ich denn da sichergehen, dass in der Datei sonst nichts gespeichert ist?

freebirth_one

Avatar von freebirth_one

Anmeldungsdatum:
19. Juli 2007

Beiträge: 5051

Wohnort: Mönchengladbach

Ich sag nur: debugausgaben

  • schrei mal nicht die Beuchernummer, sondern irgendwas in die Datei. Dann siehst du ob es klappt

  • am besten wäre ein direkter Feedback innerhalb der Funktion, damit du immer sihest, was genau sich ändert

    • als Konsolenprogramm würde ich da direkt auf der Konsole ausgeben; bei PHP weiß ich leider nicht, wie das geht.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Du kannst sie auf dem Terminal mit od -c anzeigen. Das zeigt Dir, welche Zeichen enthalten sind.

pemibo

(Themenstarter)
Avatar von pemibo

Anmeldungsdatum:
2. Juni 2006

Beiträge: 108

pemibo@pemibo-desktop:~$ od -c /var/www/besuchernr.txt 0000000 1 \n 0000002

AHHHHHH 😀 Jetzt muss ich den Zeilenumbruch nur noch loswerden ☺

YEPHENAS

Anmeldungsdatum:
8. Juni 2009

Beiträge: 352

pemibo schrieb:

pemibo@pemibo-desktop:~$ od -c /var/www/besuchernr.txt 0000000 1 \n 0000002

AHHHHHH 😀 Jetzt muss ich den Zeilenumbruch nur noch loswerden ☺

$besuchernr = (int) fgets(...);

pemibo

(Themenstarter)
Avatar von pemibo

Anmeldungsdatum:
2. Juni 2006

Beiträge: 108

Juhu, das hat geholfen ☺ Vielen Dank euch allen.

Antworten |