Energiequant Geschrieben 21. November 2004 Teilen Geschrieben 21. November 2004 Hi! Ich habe hier 2 Funktionen is_blocked und block_ip. Beide haben gemeinsam, daß sie zunächst eine Datei laden, welche hintereinander IP-Adressen gespeichert hat. Diese Datei wird - in block_ip - per fwrite($file,$element."\n") geschrieben, besitzt also nach jeder IP-Adresse \n als Zeilentrenner. Beim Ladevorgang werden aus dem beim Laden mittels file entstehenden Array über eliminate_endchar die Zeilenendzeichen aller Elemente eines eindimensionalen Arrays entfernt (substr($element,0,-1)). Das funktioniert eigentlich auch überall, nur irgendwie nicht in is_blocked: function is_blocked($ip) { // FIXME: irgendwie wird \n nicht eliminiert $lines = file("data/block_ip.dat"); $block=eliminate_endchar($lines); //return is_element($ip,$block); return 0; // NOTE: funktion is_blocked deaktiviert } function block_ip($ip) { $lines = file("data/block_ip.dat"); $block=eliminate_endchar($lines); if (is_element($ip,$block)==0) { $block=array_merge($block,array($ip)); } $file = fopen("data/block_ip.dat","w"); foreach ($block as $element) { fwrite($file,$element."\n"); } fclose($file); recalc_all_avgs(); } [/php] Die Datei wird korrekt nach $lines geladen, jedoch werden die Zeilenendzeichen nicht entfernt. Eigenartigerweise funktioniert auch eine Suche is_element($ip."\n",$block) nicht, was theoretisch gehen sollte, wenn nur eliminate_endchar ein Problem hätte. Eigenartigerweise ist is_blocked die einzige Funktion mit dieser Macke, in allen anderen Funktionen läuft alles bestens. Zuerst dachte ich, daß evtl. ein Steuerzeichen den PHP-Interpreter verwirrt oder ich irgendwie einen Tippfehler reingehauen hätte. Also habe ich die (dort funktionierenden) Zeilen aus block_ip kopiert. Leider scheint das nicht das Problem zu sein. Einen Fehler an den verwendeten Funktionen schließe ich aus, da sie wie gesagt im kompletten restlichen Skript wunderbar funktionieren. Habt Ihr eine Idee, wo der Fehler liegen könnte? Für mich sieht das genau identisch aus. :confused: Danke. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 22. November 2004 Teilen Geschrieben 22. November 2004 Zitat von www.php.net Anmerkung: Jede Zeile in dem resultierenden Array enthält das Zeilenende ('\0'), weshalb Sie trim() verwenden müssen, falls Sie dieses Zeichen nicht vorhanden sein soll. Vielleicht hilft das weiter ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 23. November 2004 Teilen Geschrieben 23. November 2004 function is_blocked($ip) { // FIXME: irgendwie wird \n nicht eliminiert $lines = file("data/block_ip.dat"); $linesArr = implode( $lines, "\n"); foreach ( $linesArr as $ListedIp) { if ( $ListedIp == $ip) { return true; } } return false; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 23. November 2004 Teilen Geschrieben 23. November 2004 Ja und?? Geht dieser Code jetzt oder geht er nicht? IMHO dürfte er wegen dem implode() nicht gehen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 23. November 2004 Teilen Geschrieben 23. November 2004 Ja und?? Geht dieser Code jetzt oder geht er nicht? IMHO dürfte er wegen dem implode() nicht gehen. stimmt müsste so heissen: function is_blocked($ip) { // FIXME: irgendwie wird \n nicht eliminiert $lines = file("data/block_ip.dat"); $linesArr = implode( "\n", $lines); foreach ( $linesArr as $ListedIp) { if ( $ListedIp == $ip) { return true; } } return false; } [/PHP] aber ob das geht musste den Threadsteller fragen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 24. November 2004 Teilen Geschrieben 24. November 2004 Du meinst wohl: function is_blocked($ip) { // FIXME: irgendwie wird \n nicht eliminiert $lines = file_get_contents("data/block_ip.dat"); $linesArr = explode( "\n", $lines); foreach ( $linesArr as $ListedIp) { if ( $ListedIp == $ip) { return true; } } return false; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 24. November 2004 Teilen Geschrieben 24. November 2004 hast recht, der threadsteller hat mich durch die verwendung von file() durcheinander gebracht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 24. November 2004 Teilen Geschrieben 24. November 2004 So, hab jetzt nochmal genauer geschaut, die Funktion is_element(), die der Threadersteller (jetzt auskommentiert) verwendet hat, gibts IMHO garnet. Auf mein erstes Posting hinweisend würde ich folgenden Code vorschlagen: function is_blocked($ip) { $lines = file("data/block_ip.dat"); foreach ( $lines as $ListedIp) { //substr schneidet die beiden letzten Zeichen, das \n und das \0 ab if ( substr($ListedIp,0,2) == $ip) { return true; } } return false; }[/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Energiequant Geschrieben 24. November 2004 Autor Teilen Geschrieben 24. November 2004 Tut mir leid, daß ich nicht früher geantwortet habe. Erstmal danke für Eure Mühe, ich werd die Sachen nachher mal ausprobieren. is_element habe ich mir selbst geschrieben (php.net war gerade down, sodaß ich nicht suchen konnte). Ich mache darin nichts anderes als ein übergebenes Array mit foreach zu durchlaufen und im Falle eines Fundes 1, andernfalls 0 zurückzugeben. Daß PHP 2 Endzeichen, \n und \0 in geladenen Textdateien hat, ist mir neu. Bisher habe ich hier mein selbst geschriebenes eliminate_endchar benutzt: function eliminate_endchar($with) { $without=array(); foreach ($with as $element) { $without=array_merge($without,array(substr($element,0,-1))); } return $without; } [/PHP] Was mir im Nachhinein noch einfiel, ist, daß evtl. das -1 den Fehler verursacht und besser durch ein strlen($element)-1 ersetzt werden sollte. Ansonsten noch eine Frage zu Hobbes: substr($ListedIp,0,2) - heißt das nicht eigentlich, daß Du die ersten 2 Zeichen nimmst statt die letzten wegzulassen oder bin ich jetzt grad total durch den Wind? Übrigens scheint mein Fehler sporadischer Natur zu sein - an einer anderen Stelle trat er nochmals auf (wieder identische Zeilen) und ich musste ihn durch einen Workaround (an die Suche ein \n anhängen) umgehen. Diesmal ging das, während es bei is_blocked keine Besserung brachte. Eigenartigerweise (ich hab nichts an den dort aufgerufenen Funktionen oder Dateien geändert) funktionierte dieser Workaround ein paar Stunden später nicht mehr. Als ich ihn entfernte lief alles bestens. Ob auch is_blocked in seiner ursprünglichen Form wieder geht hab ich bisher nicht weiter getestet, aber seltsam ist es schon. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.