IP Counter hat Problem

Moin…
Habe ein Problem:

Also hier ist die Counterdatei:
[php]
$ip = gethostbyaddr($REMOTE_ADDR);
$fp = fopen( $filename,„r“);
$Old = fread($fp, 100);
fclose( $fp );

if($ip !== $_SESSION[‚ip‘])
{
$Old = split („=“, $Old, 5);

$NewCount = $Old[1] + ‚1‘;

$New = „Besucherzähler: $NewCount“;

$fp = fopen( $filename,„w+“);
if (flock($fp, 2)) {
fwrite($fp, $New, 100); }
fclose( $fp );

print „Besucherzähler: $NewCount“;

$_SESSION['ip'] = $ip;

}
[/php]INFO: $filename ist die Logdatei inklusive Pfad…

Also der Counter geht nicht eins höher, sobald jemand die Seite anschaut.
Vielleicht kann ich mich irren, dass es nicht funzt. Ich habe es vorher mit dem Laptop aufgerufen und der Zähler blieb auf 1.
Kann jemand den Fehler finden? (Falls es überhaupt einen gibt)

Also geht dazu noch auf die Seite http://matibaski.paradoxe.de/MyB damit ich sehe, ob es doch funktioniert. Ist aber eigentlich nicht möglich dass der Laptop die gleiche IP wie der PC hat. Nunja, Versuch ists wert.

MfG, matibaski

Mach mal am anfang(1.zeile nach <?php
error_reporting(E_ALL);
und berichte, was rauskommt.

MfG

BlackMaster

Klar… Hätte ich gleich verwenden sollen :smiley:

Es erscheint dieser Fehler:
( http://matibaski.paradoxe.de/MyB/ )
Notice: Undefined variable: _SESSION in /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/_private/mybcounter/counter.php on line 27

Notice: Undefined offset: 1 in /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/_private/mybcounter/counter.php on line 31

Doch was kann das sein?
Ich habe mal session_start(); oben eingeschrieben, doch dann kam dies:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/index.php:82) in /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/_private/mybcounter/counter.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/index.php:82) in /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/_private/mybcounter/counter.php on line 2

Notice: Undefined index: ip in /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/_private/mybcounter/counter.php on line 28

Notice: Undefined offset: 1 in /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/_private/mybcounter/counter.php on line 32

Ich weiss nicht wieso bei session_start(); die Meldung kommt, dass es den Cookie nicht senden kann… Und vor allem steht, dass bereits eine Session gestartet wurde.

Linie 2:
session_start();

Linie 28:
[php]
if($ip !== $_SESSION[‚ip‘])[/php]

Linie 32:
[php]
$NewCount = $Old[1] + ‚1‘;[/php]

Ich habe mit Sessionen seit langem nicht mehr gearbeitet. Das letzte mal als ich diese aktiv brauche, benutzte ich session_register()… Doch ich hörte hier mal, dass dies abgeschaffen wurde…

Ich hoffe, ihr könnt mir helfen.

MfG,matibaski

Hallo,

du musst session_start() aufrufen, bevor du Text ausgibst. Sonst müsste php das Cookie PHPSESSID für die Session-ID mittem im HTML-Code senden und dann macht der Browser damit ja nicht mehr das, was er soll.

Du kannst auch die Ausgabe mit ob_start() puffern und am Ende vom Script durch ob_end_flush() ausgeben. Soll sogar schneller sein als direkt per echo.

headers already sent
meint das obige, dass das Cookie nicht mehr dem Browser mtigeteilt werden kann.

N43

Zur Zeile 32:
Du musst die Anführungszeichen weglassen (von der Zahl);
Man keine Zeichenketten addieren.

Wie würde der Code mit ob_start() und ob_en_flash() aussehen?
Ich habe keine Arbeiten mit ob() gehabt…

Ich werdemal bei php.net schaun, aber die erklären das sowieso kompliziert.
Ich hoffe,du kannst mir da auf die Srpünge helfen.

Und das mit den ‚‘ bei der Zahl stimmt… Der Error ist nun weng. Mit dem neuen Code
[php]

<? session_start(); error_reporting(E_ALL); $filename = "myblog.log"; $ip = gethostbyaddr($REMOTE_ADDR); $fp = fopen( $filename,"r"); $Old = fread($fp, 100); fclose( $fp ); if($ip !== $_SESSION['ip']) { $Old = split ("=", $Old, 5); $NewCount = $Old[1] + 1; $New = "Besucherzähler: $NewCount"; $fp = fopen( $filename,"w+"); if (flock($fp, 2)) { fwrite($fp, $New, 100); } fclose( $fp ); print "Besucherzähler: $NewCount"; $_SESSION['ip'] = $ip; } ?> [/php]

Erscheint kein Error, aber auch kein Counter… :smiley:

MfG,matibaski

edit:
Habe den Code mit ob_() ausprobiert.
Sieht so aus, funzt aber nicht. Hilft mir jemand?
[php]

<? ob_start(); error_reporting(E_ALL); $filename = "myblog.log"; $ip = gethostbyaddr($REMOTE_ADDR); $fp = fopen( $filename,"r"); $Old = fread($fp, 100); fclose( $fp ); if($ip !== $_SESSION['ip']) { $Old = split ("=", $Old, 5); $NewCount = $Old[1] + 1; $New = "Besucherzähler: $NewCount"; $fp = fopen( $filename,"w+"); if (flock($fp, 2)) { fwrite($fp, $New, 100); } fclose( $fp ); $ausgabe = "Besucherzähler: $NewCount"; $_SESSION['ip'] = $ip; } ob_end_flush($ausgabe); ob_end_clean(); ?> [/php]

MfG, matibaski

http://de2.php.net/manual/de/function.ob-get-contents.php
du musst auch „ob_get_contents();“ in eine var speichern, und danach ausgeben :wink:

Hab’s mal umgeändert, doch geht immernoch nicht.
so:
[php]

<? ob_start(); error_reporting(E_ALL); $filename = "myblog.log"; $ip = gethostbyaddr($REMOTE_ADDR); $fp = fopen( $filename,"r"); $Old = fread($fp, 100); fclose( $fp ); if($ip !== $_SESSION['ip']) { $Old = split ("=", $Old, 5); $NewCount = $Old[1] + 1; $New = "Besucherzähler: $NewCount"; $fp = fopen( $filename,"w+"); if (flock($fp, 2)) { fwrite($fp, $New, 100); } fclose( $fp ); $ausgabe = "Besucherzähler: $NewCount"; $_SESSION['ip'] = $ip; } $druck = ob_get_contents(); ob_end_flush($druck); ob_end_clean(); ?>[/php]

Habe nun ob_get_contents eingeschrieben, wollte jedoch nicht.
Und ich hab’s auch schon so ausprobiert:
[php]
$ausgabe = „Besucherzähler: $NewCount“;

$_SESSION['ip'] = $ip;

}

$druck = ob_get_contents($ausgabe);

ob_end_flush($druck);
ob_end_clean();[/php]

Ich denke mal, logisch gedacht, dass es gar nicht gehen kann, denn ich habe im Script ja diesen Codeteil:
[php]
if($ip !== $_SESSION[‚ip‘])[/php]
Der Prüft ja nach der Session…
Setzt ob() auch Sessionen? Ich denke nicht :smiley:
Wie würde das Script aussehen bei der if-Abfrage, da ich ja keine Sessionen benutze?

MfG, matibaski

ob_end_flush() ist schon richtig. Der Befehl beendet das Puffern und gibt den Inhalt aus. Man muss dem Befehl aber keine Parameter übergeben. ob_end_clean() muss nicht mehr aufgerufen werden, da ob_end_flush() den Puffer bereits leert.

@matibaski: Gibst du denn schon Text aus, bevor du das Script einbindest? Wenn ja, dann muss entweder das ob_start() oder das session_start() vor die erste Textausgabe. Wenn du session_start() vor der ersten Textausgabe einbindest brauchste ob_start() nicht mehr. session_start() brauchste aber immer, wenn du mit 'ner Session arbeiten willst.

N43

Nein…
Der Text wird vorher nicht ausgegeben.
Ich dachte vorher, dass ich per Session das so machen kann, wegen der IP.
Nunja, klappte doch nicht…

Wenn mir niemand helfen kann, lad ich mir mal 'nen IP Counter runter und schreibe den um :smiley: (learning by doing)

MfG, matibaski

[PHP]
ob_start();
echo"blödes schnuff";
echo", komisches schnuff";
$ausgabe=ob_get_contents();
ob_end_clean();
echo $ausgabe;
[/PHP]

ausgegeben wird:

blödes schnuff, komisches schnuff

Hallo,

[php]<?php ob_start(); echo"blödes schnuff"; echo", komisches schnuff"; ob_end_flush(); ?>[/php]liefert genau das selbe Ergebnis :wink:

@matibaski:

utput started at /home/httpd/vhosts/paradoxe.de/subdomains/matibaski/httpdocs/MyB/index.php:82) in
Was steht denn bei dir in der index.php in Zeile 82?

N43

Kann ich nicht sagen, da diese Datei includiert ist in der index.php.
Hab’s nun entfernt wegen den Errors und Probiere es halt nur mit der Datei selbst:
http://matibaski.paradoxe.de/MyB/_private/mybcounter/counter.php

Nun probiere ich es immer wieder auf dieser Ebene aus…
Doch wie gesagt, funzt nicht.

@Schnuff:
Danke ich werds ausprobieren.

MfG, matibaski

edit:
Code umgeändert…
Nun erscheint kein Error mehr, aber auch keine Ausgabe.
Hier ist der vollständige Code:[php]

<? session_start(); error_reporting(E_ALL); ob_start(); // OB starten $filename = "myblog.log"; // Logdatei gethostbyaddr($_SERVER['REMOTE_ADDR']); // IP holen $fp = fopen( $filename,"r"); // $Old = fread($fp, 100); // Alten Counter hervorrufen fclose( $fp ); // if($ip !== $_SESSION['ip']) // IP prüfen { $Old = split ("=", $Old, 5); $NewCount = $Old[1] + 1; // Alten Counter erhöhen $New = "Besucherzähler: $NewCount"; // Ausgabe $fp = fopen( $filename,"w+"); // Öffnen der Date, zum neuen Stand speichern if (flock($fp, 2)) { fwrite($fp, $New, 100); } fclose( $fp ); $ausgabe = "Besucherzähler: $NewCount"; $_SESSION['ip'] = $ip; } $druck = ob_get_contents(); ob_end_clean(); echo $druck; ?> [/php]

Seht ihr, anhand des Codes, wieso es nicht funktionieren will?
Also ich finde keinen Fehler. PHP Code mässig hat es auch keine, aber irgendein Aufbaufehler.

MfG, matibaski

gethostbyaddr($_SERVER['REMOTE_ADDR']); // IP holenich seh grad, du speicherst die IP garnicht in $ip. Die steht übrigens in $_SERVER[‚REMOTE_ADDR‘], da musste nicht mehr den Host ermitteln.

Zum ob_*, das brauchste nur, wenn du die Session nicht am Anfang vom Script gestartet hast. Dann musste mit ob_start() am Anfang vom Script die Ausgabe puffern.

N43