fopen verursacht Dateidownload

Always-Godlike

Always-Godlike

Das Freak
moin leutz.

Ich sitze seit 2 Tagen an nem Problem, das mir irgendwie nicht logisch erscheint. Ich versuche einen Counter mithilfe von einer .txt zu machen. Ich habe den selben schon mit mysql gemacht, möchte des ganze aber auch mit FlatFiles erreichen. Ich bin noch am Anfang und habe jetzt schon ein Problem.

counterfuncs.php
Code:
<?
/*------------------------------------------------------------------------------*/
$ip = $_SERVER['REMOTE_ADDR'];
$browser = $_SERVER['HTTP_USER_AGENT'];
$sperrzeit = 300;
$time = time();
$timer = $time-$sperrzeit;
$file = "files/counter.txt";


function checkip()
{
global $file;
$fp = fopen($file, "a+");
for($i = 0;$fp < filesize($file); $i++)
{
$a[$i] = explode("||", fgets($fp));
}
fclose($fp);
$i = count($a);

for($i; $a[$i][0] > $timer;$i--)
{
if($a[$i][1] == $ip)
{
echo "Eingetragen";
}
else
{
echo "Schon da!";
}
}
}

if(checkip() == true)
{
$fp = fopen($file, "a+");
fwrite($fp, $time."||".$ip."||".$browser."\n");
fclose($fp);
}
?>
Sobald ich versuche die Seite auszuführen startet er den Download der php-Datei statt sie auf dem Server auszuführen. Sobald ich bei fopen() des $file wegmache gehts normal, außer das mir Apache halt nen Fehler ausspuckt, dass er die Datei nicht findet bzw. der Parameter falsch ist, iss ja nicht weiter schlimm...
Schreibe ich noch die Zeile
Code:
$file = "files/counter.txt";
statt dem global $file; in die Funktion erhalte ich trotzdem noch den Fehler. Bis auf dieses fopen in dieser Funktion funktioniert der gesamte Rest.

Die Datei wird übrigens ganz oben in der index.php aufgerufen mithilfe von <? include_once 'includes/counterfuncs.php'; ?> und steht auch ganz am Anfang, falls das wichtig sein sollte...


Ich hoffe ihr könnt mir helfen.
 
Zuletzt bearbeitet:
Darf ich dieses bedrückende Schweigen so werten, dass hier einfach keiner PHP kann, keiner den Befehl fopen() kennt oder keiner Bock hat zu antworten?

Ich bräuchte dringend Abhilfe, dieses Problem stört im moment meinen gesamten Counter, und da muss noch viel Programmcode rein...
 
Erstens ist file ein keyword (Funktion file siehe php-ref). Mit $file hast da schonmal schlechte Karten, dann globalisierst Du die file-varibale innerhalb deiner funktion obwohl diese die variable gar nicht übertragen bekommt, das macht mich etwas stutzig. Wenn Du den Aufruf

Code:
function checkip($filename)
{
 ...
}
machst, wie verhält sichs dann? Natürlcih $file noch überall durch $filename ersetzen.
 
Das mit dem dem global hab ich genauso vom Beispiel in Selfphp übernommen. http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=77&group=12

hab auch schon probiert, die variable $datei zu nennen, geht immernoch ned und ändert rein garnix. Soweit ich weiß gibt es file nur als funktion file() und als array $_FILES[] bei einem Dateiupload. Ich hab auch einen anderen Weg versucht,das ganze ohne die Funktion checkip()..

Code:
<?
/*------------------------------------------------------------------------------*/
$ip = $_SERVER['REMOTE_ADDR'];
$browser = $_SERVER['HTTP_USER_AGENT'];
$sperrzeit = 300;
$time = time();
$timer = $time-$sperrzeit;
$file = "files/counter.txt";


$checkip = "false";
$fp = fopen($file, "r");
for($i = 0;$fp < filesize($file); $i++)
{
$a[$i] = explode("||", fgets($fp));
}
fclose($fp);
$i = count($a);

for($i; $a[$i][0] > $timer && isset($a[$i]);$i--)
{
if($a[$i][1] == $ip)
{
echo "Eingetragen";
$checkip = "true";
break;
}
else
{
echo "Schon da!";
}
}



if($checkip == "true")
{
$fp = fopen($file, "a+");
fwrite($fp, $time."||".$ip."||".$browser."\n");
fclose($fp);
}

?>
Das Problem ist immernoch dasselbe

Ich weiss man kann die 2 for-schleifen in eine bauen, aber der Übersicht wegen hab ich momentan noch 2. Sobald ich die Zeile '$fp = fopen($file, "r");' auskommentiere geht die Funktion wieder, außer das ich halt ne Menge Fehlermeldungen krieg.



Der untere Aufrauf der Datei, wo die IP dann endgültig gespeichert wird funktioniert übrigens. Wenn ich die gesamte Überprüfung auschalte schreibt er die IP's und alles in die counter.txt...
 
Zuletzt bearbeitet:
Schau mal
Code:
for($i = 0;$fp [B]<[/B] filesize($file); $i++)
 ...

Code:
for($i = 0;$fp [B]<=[/B] filesize($file); $i++)
 ...
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Das mit dem dem global hab ich genauso vom Beispiel in Selfphp übernommen. http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=77&group=12

Jo, da steht aber auch:
Eine innerhalb einer Funktion definierte Variable ist ausserhalb der Funktion nicht sichtbar. Umgekehrt gilt dasselbe, d.h. eine ausserhalb sämtlicher Funktionsblöcke global definierte Variable hat innerhalb eines Funktionsblocks keine Gültigkeit.
 
Zuletzt bearbeitet:
das <= (kleinergleich) hilft auch nicht, wieso denn auch? Das einzige was ich erhalten würde wäre ein weiteres Feld in dem Array und noch dazu womöglich eine Fehlermeldung.
Jedoch kann ich ja nicht sehen, dass er einen Fehler ausspuckt, weil er mir ja lieber stattdessen einen Download anbietet...


BTW: Das global wird ja grade dazu verwendet die Variable $file auch wieder in der Funktion sichtbar zu machen. Sonst würde das zweite Beispiel auf der Seite ja auch nicht funktionieren. Das es funktioniert weiß ich, weil sobald ich des global wegmache er sofort fragt was $file ist. Wenn ich global wieder hinsetze und mir innerhalb der funktion mithilfe von 'echo' den Inhalt von $file ausgeben lasse, kommt der richtige String.



!Ich warte immernoch auf Hilfe!


Habe eine Lösung gefunden....

Leider konnte mir ja keiner sagen wie ich des ganze mit dem fgets mache.... da musste ich den Script halt en bissl verändern und habe jetzt ne andere Methode gefunden. Ist im Prinzip sogar einfacher, schneller und kürzer als die andere Methode.
momTrotzdem nochmal Danke an die, die sich bemüht haben mir zu helfen.

Code:
<?
/*------------------------------------------------------------------------------*/
$ip = $_SERVER['REMOTE_ADDR'];
$browser = $_SERVER['HTTP_USER_AGENT'];
$sperrzeit = 300;
$time = time();
$timer = $time-$sperrzeit;
$file = "files/counter.txt";


$checkip = "false";
$fp = fopen($file, "r");
$inhalt = fread($fp, filesize($file));

$a = explode("\n", $inhalt);
for($i = 0; $i < count($a); $i++)
{
$a[$i] = explode("||", $a[$i]);
}
fclose($fp);


for($i = count($a)-1; ($a[$i][0] > $timer) && (isset($a[$i]));$i--)
{
if($a[$i][1] == $ip)
{
$checkip = "true";
break;
}
}


if($checkip == "false")
{
$fp = fopen($file, "a+");
fwrite($fp, $time."||".$ip."||".$browser."\n");
fclose($fp);
}

?>
 
Zuletzt bearbeitet:

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Queue für copy Script

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Akonadi startet nicht mehr

NagiosGrapher 1.7.1 funktioniert nicht

Zurück
Oben