Zum Inhalt springen

[PHP] Gleiche Zeilen liefern Unterschiedliches


Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...