Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Fehler in Funktion (Reload-Funktion)
Frage
Ich wollte mir sowas wie eine Reload-Sperre basteln und hab auch einpaar Funktionen dazu geschrieben, nur ist bei einer Funktion ein Fehler drin!
Erstmal zur Erläuterung der Funktion: Diese Funktion soll gucken, ob eine IP-Adresse schon in meiner Textdatei steht, wenn ja, soll die Zeit, die dahinter steht, aktualisiert werden! Wen diese IP da noch nicht steht, soll halt eine neue Zeile mit der IP und der Zeit hinzugefügt werden!
Aufbau der Textdatei ist z.B.:[code]
127.0.0.23""1036155836
127.0.0.1""1036155723
127.0.0.122""1036155664
[/code]
Meine Funktion lautet folgendermaßen:[code]
function iphinzu($dateiname, $ip){
$dateiinhalt = file($dateiname);
$zeit = time();
$vorhanden = false;
for ($i = 0; $i <= count($dateiinhalt) - 1; $i++){
$infos = split("\"\"", $dateiinhalt[$i]);
if($infos[0] == $ip){
$vorhanden = true;
$infos[1] = $zeit;
$dateiinhalt[$i] = join("\"\"", $infos);
break;
}
}
if($vorhanden == false) { array_push($dateiinhalt, $ip."\"\"".$zeit); }
$ausgabe = join("\r\n", $dateiinhalt);
$fp = fopen($dateiname, "w");
flock($fp, 2);
fputs($fp, $ausgabe);
flock($fp, 3);
fclose($fp);
}
[/code]
Das Problem ist, dass sich zwischen allen Einträgen immer mehr leere Zeilen in die Textdatei einfügen! Erst ist da keine Leerzeile, dann eine, dann drei, sieben, 15, 31, ...
Ich hoffe, einer von euch kann mir helfen!
mfg, Ümit
Antwort 1 von semi
Versuche es mit
join("\n", $dateiinhalt);
Du findest ein funktionierendes Skript unter http://www.php4-forum.de/beispiele/ip_sperre.htm
Gruß,
Michael
join("\n", $dateiinhalt);
Du findest ein funktionierendes Skript unter http://www.php4-forum.de/beispiele/ip_sperre.htm
Gruß,
Michael
Antwort 2 von misterUE
Danke für die Hilfe, aber das geht leider auch nicht! Dann bleiben zwischen "\n" immer noch die leeren Stellen bzw. werden immer mehr "\n" hinzugefügt!
Also eigentlich wollte ich nicht direkt einen Counter mit Reloadsperre sondern nur, dass bei der jeweiligen IP-Addresse die Zeit eingetragen wird! Ausgewertet wird das über eine andere Funktion (, die klappt)!
Hier hab ich mein Problem etwas genauer beschrieben:
Inhalt der Textdatei ist:
Jetzt kommt einer mit einer anderen IP-Addresse (z.B.: 120.0.0.44), dann soll diese IP mit der Zeit da hinzugefügt werden. Beispiel:
Wenn jetzt eine IP kommt, die schon vorher eingetragen wurde (z.B.: 127.0.0.122, soll nur die Zeit verändert werden: Beispiel:
Vielen vielen Dank für Hilfe!
mfg, Ümit
P.S.: Wie kann ich z.B. den 5. Wert eines Arrays löschen und die anderen Werte sollen dann dementsprechend verschoben werden (also $array[6] wird zu $array[5] usw.)? Dann kann ich das ja vielleicht damit bewerkstelligen!
Also eigentlich wollte ich nicht direkt einen Counter mit Reloadsperre sondern nur, dass bei der jeweiligen IP-Addresse die Zeit eingetragen wird! Ausgewertet wird das über eine andere Funktion (, die klappt)!
Hier hab ich mein Problem etwas genauer beschrieben:
Inhalt der Textdatei ist:
127.0.0.23""1036155836
127.0.0.1""1036155723
127.0.0.122""1036155664
Jetzt kommt einer mit einer anderen IP-Addresse (z.B.: 120.0.0.44), dann soll diese IP mit der Zeit da hinzugefügt werden. Beispiel:
127.0.0.23""1036155836
127.0.0.1""1036155723
127.0.0.122""1036155664
120.0.0.44""1036156534
Wenn jetzt eine IP kommt, die schon vorher eingetragen wurde (z.B.: 127.0.0.122, soll nur die Zeit verändert werden: Beispiel:
127.0.0.23""1036155836
127.0.0.1""1036155723
127.0.0.122""1036158841
120.0.0.44""1036156534
Vielen vielen Dank für Hilfe!
mfg, Ümit
P.S.: Wie kann ich z.B. den 5. Wert eines Arrays löschen und die anderen Werte sollen dann dementsprechend verschoben werden (also $array[6] wird zu $array[5] usw.)? Dann kann ich das ja vielleicht damit bewerkstelligen!
Antwort 3 von semi
Siehe array_splice in PHP-Handbuch.
Beispiel:
Gruß,
Michael
Beispiel:
$a = array("a", "b", "c", "d");
echo $a[2] . "<br>"; // c
array_splice($a, 2, 1); // offset: 2, length: 1
echo $a[2] . "<br>"; // dGruß,
Michael
Antwort 4 von semi
Übrigens, Du kannst auch direkt mit array_filter, die Zeilen, ohne Inhalt filtern.
function matchNotEmptyLines($var) {
return !empty($var);
}
function printItem($item, $key) {
echo "$key: $item<br>\n";
}
$a = array("a", "b", "", "c", "", "d");
$a = array_filter($a, "matchNotEmptyLines");
array_walk($a, "printItem");Antwort 5 von misterUE
Vielen Dank für die Hilfe, klappt jetzt alles super!
mfg, Ümit
mfg, Ümit

