IP gestützter Counter

Hallo!
Ich bin gerade dabei einen IPgestützen counter zu programmieren. Dabei soll die IP gespeichert werden. WEnn man nun auf die seite geht, und die IP nicht in einer Datei vermerkt ist, soll der counter einen Zähler hochgestellt werden. Ist die IP vermerkt, so soll nichts geschehen und der counterstand einfach ausgegeben. Hier das script:
[php]

<?php $datei = fopen("ip.php","r"); $inhalt = fread($datei,100000); fclose($datei); $inhalt = strrpos($_SERVER['REMOTE_ADDR'],"b"); if ($inhalt == true){ $_datei = fopen("counter.php","r"); $_counterstand = fgets($_datei,10); echo $_counterstand; fclose($datei); } else { $_datei = fopen("counter.php","r+"); $_counterstand = fgets($_datei,10); $_counterstand++; rewind($_datei); fwrite($_datei,$_counterstand); fclose($_datei); $dat = fopen("ip.php","w"); fwrite($dat,$IP); fclose($dat); echo $_counterstand; } ?>

[/php]
Problem: es wird garnichts ausgegeben…
Weis jemand rat?!

zu deinem eigentlichen problem kann ich grad wenig sagen, da ich mich mit den file funktionen noch ned wirklich auseinandergesetzt hab, aber das counterprinzip von dir is sehr schlecht.

  1. haben sehr viele user eine dynamische ip adresse und jedesmal beim einwählen bekommen sie eine andre zugewiessen
  2. is sie glaub ich ned sehr schnell, was aber relativ egal is wenns ned so viele zugriffe gibt

ich würd das mit einer session lösen, also jedesmal wenn ein benutzer die seite betritt wird eine sessionvariable gsetzt und der counterstand wird nur erhöht wenn die variable nicht existiert. und dann musst du nurnoch eine datei mit dem einen wert anlegen (anzahl der besuche)

Session ist totaler Quatsch, da die Session (wie es der Name ja schon vermuten lässt) eine Sitzung ist, die mit dem Schliessend es Browsers beendet wird. Zudem wird für jeden User natürlich eine eigene Session gestartet.
Die Lösung, die IP’s an einer Zentralen stelle zu speichern lässt sich nicht umgehen. Leider gibt es keine Möglichkeit einen User nur einmalig zu Zählen, da eine eineindeutige Identifikation nicht möglich ist.
Das würde sich theoretisch über Cookies realisieren lassen, nur können diese vom User abgelehnt werden und somit ist diese Lösung auch eher schlecht.

ich weiss wohl, dass die session sich beendet wenn die verbinung geschlossen wird zum server, aber die ip lösung finde ich um einiges umständlicher

ausserdem würd ich lieber wissen wieviele besuche meine seite hat, als dass ich weiss wieviele verschiedene internetverbindungen zugriff hatten. ich finde die lösung per session am sinnvollsten. und stell dir vor du hast ne stammcommunity und sehr rege aktivität, also 1000 besuche am tag von den stammusern. dann zeigt die ip lösung gerade mal die neuen an (und ca 50% der stammkunden, weil die alle dynamische IPs haben). ausser ein ISP vergibt mal eine IP, die vorher jemand anders bekommen hat einem anderen surfer, und der wird dann als „schon dagewesen“ abgestempelt, obwohl das ned so is…

naja, im endeffet wird wohl die cookielösung am besten sein, die 0,01% der surfer, die keine cookies erlauben werden halt nicht mitgezählt. dann gibst du dem cookie eine lebensdauer von 24H und wertest täglich die zugriffe aus :wink:

naja, musst du selbst wissen welche lösung du willst

@lama: Hast du MYSQL. Dann würde das um einiges einfacher gehen.

My SQL hab ich leider nicht…
Ihr habt mich überzeugt, wie geht das mit den cookies?!

sieh dir den angepinnten loginthread an, da steht was drinn über cookies, du musst dann einfach ein cookie setzen, dass beweisst, dass der client schon am server war. und wenn das cookie existiert, dann wird der besucherwert nicht inkrementiert…

Ich hab mir jetzt ein script gebastelt, es geht aber nicht…?! Es kommen zwei Fehlermeldungen:

Notice: Use of undefined constant cookie - assumed ‚cookie‘ in /www/42/html/counter/counter.php on line 14

Warning: Cannot modify header information - headers already sent by (output started at /www/42/html/counter/counter.php:14) in /www/42/html/counter/counter.php on line 14

Das ist der code:
[php]

<?php $datei = fopen("ip.php","r+"); $inhalt = fgets($datei,10); if(isset($_COOKIE['cookie'])) { echo $inhalt; } else { $timestamp = time(); setcookie(cookie,$_SERVER['REMOTE_ADDR'],$timestamp+3600*24); $inhalt++; fwrite($datei,$inhalt); echo $inhalt; } ?>

[/php]
Was mache ich falsch?!

Du gibst Inhalt aus, bevor du das Cookie setzts. Dreh die If Abfrage um, dann passts.

MFG
Alti

Das ist doch gewollt so, wenn ein cookie vorhanden ist, gibt er nur den inhalt aus, wenn keins da ist wird
1.) 1 Cookie gesetzt
2.) Der counterstand erhöht und ausgegeben…

Soweit ich weiß, gehören Cookies zum Header, also müssen sie auch vor dem Inhalt gesetzt werden.
Dreh die If Abfrage rum, das heißt, mach nen „!“ vors isset und setz nen @ vor $_COOKIE[‚cookie‘]

MFG
Alti

danke erstmal, nur leider geht es immer noch nicht. Jetzt sieht mein code so aus:
[php]

<?php error_reporting(E_ALL); $datei = fopen("ip.php","r+"); $inhalt = fgets($datei,10); if(!isset($_COOKIE['cookie@lange-martin'])) { echo $inhalt; } else { $timestamp = time(); setcookie("cookie@lange-martin",@$_SERVER['REMOTE_ADDR'],$timestamp+10); $inhalt = $inhalt+1; rewind($datei); fwrite($datei,$inhalt); echo $inhalt; } ?>

[/php]
Theoretisch müsste jetzt beim neuladen alles 10 sekunden ein Besucher mehr gezeigt werdne, tut er aber nicht, weis jemand wieso?!
[/php]

Du musst natürlich das was in der if Schleife und was in der Else Schleife steht auch vertauschen. Sorry, hatte ich vergessen zu erwähnen

MFG
Alti

geil! Es geht! vielen dank!!!

ich wuerde lieber einen cookie auf einen bestimmten wert setzen, und wenn der cookie beim naechsten seitenaufruf den wert enthaelt, den wert ändern und inkrementieren (so werden leute ohne cookies dann halt gar nicht gezählt - immer noch besser als total unwahrscheinliche statistiken wegen einigen wenigen „verrückten“ [wie ich] )

ps: cookies/sessions ist sehr viel besser geignet, AOL user (das sind nicht grade wenig…) „ändern“ [afaIk] bei jedem Aufruf ihre IP da sie einen webproxy vorgeschaltet haben der dynamisch wechselt (einige andere provider machen das auch…) - dann kann man natuerlich den Header vom proxy auf die eigentliche IP adresse auswerten, die man aber wieder fälschen kann um das system zu umgehen… nicht empfelenswert