• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] PHP - Zeit & IP-Sperre

Hallo-Welt

Aktives Mitglied
Guten Abend allerseits,

Ich bin zurzeit am Verzweifeln. Ich habe lange nach einer guten funktion gesucht, bei welcher jeder Benutzer, in meinem Fall, alle 5 Minuten nur ein Kommentar posten kann. Da ich nur sehr sehr Komplizierte Lösungsansätze dazu gefunden habe, welche ich nicht ganz oder gar nicht nachvollziehen konnte, hab ich mir halt gedacht, schreib ich das Teil einfach selbst, wie schwer kann das sein.

Aber jetzt geht gar nichts mehr. Hier ist mein Lösungsansatz, welcher ich bissher habe:
PHP:
<?php
if(file_exists("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")){
  if(file("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")<=time(s)-300){
  goto nextstep;
  }else{
  echo 'Irgendein bloedsinniger Fehler ist aufgetreten, da Sie bereits zu viele Kommentare geschreiben haben, oder so. Das tut uns leid, jetzt noch ein sarkastisches Trauer-Smiley ":(" und Schluss - Versuchen Sie\'s halt spaeter noch mal. ';
  exit;
  }
}else{
$txt = fopen("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", "a");
fwrite($txt, time());
fclose($txt);


nextstep:

/* hier kommt dann irgendeine daemliche Funktion, also der Post des Kommentars */
?>

Dieser Code SOLLTE für jede IP-Adresse, von welcher aus ein Kommentar gepostet wird zuerst prüfen, ob die Datei "timestamp-[IP-ADRESSE].txt" im Ordner "meine-dateien" existiert. Wenn ja, soll er prüfen, ob der Inhalt dieser Datei kleiner oder gleich als die aktuelle Zeit minus 5 Minuten (300 Sekunden) ist. Wenn ja, ist alles in Ordnung (wobei mir gerade Auffält, dass dann der Timestamp in der Textdatei noch aktualisiert werden müsste, sprich, die Datei überschrieben werden müsste) und weiter gehts mit dem post, wenn nein, Fehler.
Wenn die Datei "timestamp-[IP-ADRESSE].txt" gar nicht erst existiert, soll sie erstellt werden und darin der Timestamp geschrieben werden.

Das ganze funktioniert aber nicht :(

Ich bin am Verzweifeln; was ist an meiner Überlegung, bzw. an meiner Ausführung falsch?
 
Zuletzt bearbeitet:
Werbung:
Hast du vielleicht irgendwelche Zwischenpunkte bis zu denen es funktioniert? oder was genau funktioniert denn nicht? Warum löst du das ganze nicht mit einer SQL DB?
 
Warum ich es nicht mit einer Datenbank löse ist leicht geklärt: Ich würde es gerne selbst nachvollziehen können. Und da ich bissher noch nie mit 'ner Datenbak gearbeitet habe... Außerdem macht es ansich ja auch keinen großen Unterschied, ob das ganze in einer DB eingetragen wird, oder halt in einer Textdatei.

Hast du vielleicht irgendwelche Zwischenpunkte bis zu denen es funktioniert? oder was genau funktioniert denn nicht?
Nein, habe ich nicht. Ich habe genau das, was ich gepostet habe, nicht mehr und nicht weniger. Das heißt, der Rest (also die Post-Funktion) funktioniert, nur wird keine Textdatei angelegt, wo der Timestamp drin steht, funktioniert das Script also nicht. Und daher frage ich euch, was ist falsch?
 
Werbung:
Du brauchst doch sowieso eine Datenbank um die Kommentare zu speichern. Da hast du alles schon drin (Zeitpunkt, userId (bzw. ip, wenn du kein Login hast...)

Was falsch ist kannst du ja debuggen... Tritt ein Fehler auf? Wird das File angelegt? steht was drin?

soweit ich weiss gibt z.b. file() ein array zurück... und was soll das goto: sein?
 
Du legst für jeden User eine eigene .txt-Datei an? Warum speicherst du nicht jede IP + Timestamp in einer Textdatei? Dann liest du es mit einen Array aus und überprüfst ob diese IP in den letzten 300 Sekunden schon was gepostet hat, oder nicht. Oder noch besser in einer Datenbank.
 
@thecain
mit goto springst du zu einer Zielanweisung.
Und eine Datenbank braucht er nicht unbedingt. Es würde zwar alles vereinfachen, aber er kann die Kommentare auch in einer txt File speichern.

@Riminey
Ich kann dir auch nur raten dich einmal mit Datenbanken zu beschäftigen, das wären sicher maximal nur 60 min bist du eine lauffähige Datenbank hast. Damit würdest du dir viel Zeit und Arbeit ersparen.

Warum die txt File nicht angelegt wird liegt wohl an den Rechten im Ordner, falls du schon online arbeitest.
Falls ja dann müsstest du mit Filezilla auf dein server gehen und mit der rechten maustaste auf den Ordner klicken und die Dateiberechtigung einstellen.

Du kannst das aber auch mit PHP versuchen, da gibt es die Funktion chmod
 
Werbung:
Die Rechte des Ordners sind 755, dürfte also an sich nicht das Problem sein.
Sicherlich wäre ein DB die klügere Wahl, daran will ich auch gar nicht zweifeln, jedoch will ich mich jetzt nicht damit rumärgern und bevorzuge es daher, das ganze in einer Textdatei abzuspeichern.

Ich hab das ganze noch einmal zur Veranschaulichung leicht überarbeitet.
PHP:
<?php
if(file_exists("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")){
  if(file("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")<=time(s)-300){
/* lösche Inhalt von Textdatei */
  fclose(fopen("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", 'w'));
  goto nextstep;
  }else{
  echo 'Irgendein bloedsinniger Fehler ist aufgetreten, da Sie bereits zu viele Kommentare geschreiben haben, oder so. Das tut uns leid, jetzt noch ein sarkastisches Trauer-Smiley ":(" und Schluss - Versuchen Sie\'s halt spaeter noch mal. ';
  exit;
  }
}else{

nextstep:

$txt = fopen("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", "a");
fwrite($txt, time());
fclose($txt);


/* hier kommt dann irgendeine daemliche Funktion, also der Post des Kommentars, oder hier beispielhaft ein echo */
echo "Yes, you did it!";
}
?>
Jetzt SOLLTE die Funktion zusätzlich den aktuelllen Inhalt der Textdatei löschen, wenn vorhanden und aktualisiert dann den Unix Timestamp.
Weiterhin habe ich unten ein echo hinzugefügt und die Klammer geschlossen. so ausgeführt bekomme ich als Output vom PHP-Compiler:
Code:
Warning: fopen(/meine-dateien/timestamp-[hier meine IP-Adresse].txt) [function.fopen]: failed to open stream: No such file or directory in /users/example/www/blabla/another_blabla/example.php on line 15

Warning: fwrite() expects parameter 1 to be resource, boolean given in /users/example/www/blabla/another_blabla/example.php on line 16

Warning: fclose() expects parameter 1 to be resource, boolean given in /users/example/www/blabla/another_blabla/example.php on line 17
Yes, you did it!

Das ist der output. Eine Textdatei wird nicht angelegt und ich bekomme somit bei jedem Reload das "Yes, you did it!"-echo statt dem exit-Befehl. Was ist an meinem Code falsch, dass keine Text-datei angelegt wird. Muss ich noch irgendein Parameter setzen? Die Zugriffsrechte des Ordners sind wie gesagt 755 (Alle Rechte für den Besitzer; Lese- und Ausführrechte für andere). Ich bin wirklich am Verzweifeln. Wer kann mir helfen?
 
Die Rechte des Ordners sind 755, dürfte also an sich nicht das Problem sein.
Sicherlich wäre ein DB die klügere Wahl, daran will ich auch gar nicht zweifeln, jedoch will ich mich jetzt nicht damit rumärgern und bevorzuge es daher, das ganze in einer Textdatei abzuspeichern.

Ich hab das ganze noch einmal zur Veranschaulichung leicht überarbeitet.
PHP:
<?php
if(file_exists("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")){
  if(file("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")<=time(s)-300){
/* lösche Inhalt von Textdatei */
  fclose(fopen("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", 'w'));
  goto nextstep;
  }else{
  echo 'Irgendein bloedsinniger Fehler ist aufgetreten, da Sie bereits zu viele Kommentare geschreiben haben, oder so. Das tut uns leid, jetzt noch ein sarkastisches Trauer-Smiley ":(" und Schluss - Versuchen Sie\'s halt spaeter noch mal. ';
  exit;
  }
}else{

nextstep:

$txt = fopen("/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", "a");
fwrite($txt, time());
fclose($txt);


/* hier kommt dann irgendeine daemliche Funktion, also der Post des Kommentars, oder hier beispielhaft ein echo */
echo "Yes, you did it!";
}
?>
Jetzt SOLLTE die Funktion zusätzlich den aktuelllen Inhalt der Textdatei löschen, wenn vorhanden und aktualisiert dann den Unix Timestamp.
Weiterhin habe ich unten ein echo hinzugefügt und die Klammer geschlossen. so ausgeführt bekomme ich als Output vom PHP-Compiler:
Code:
Warning: fopen(/meine-dateien/timestamp-[hier meine IP-Adresse].txt) [function.fopen]: failed to open stream: No such file or directory in /users/example/www/blabla/another_blabla/example.php on line 15

Warning: fwrite() expects parameter 1 to be resource, boolean given in /users/example/www/blabla/another_blabla/example.php on line 16

Warning: fclose() expects parameter 1 to be resource, boolean given in /users/example/www/blabla/another_blabla/example.php on line 17
Yes, you did it!

Das ist der output. Eine Textdatei wird nicht angelegt und ich bekomme somit bei jedem Reload das "Yes, you did it!"-echo statt dem exit-Befehl. Was ist an meinem Code falsch, dass keine Text-datei angelegt wird. Muss ich noch irgendein Parameter setzen? Die Zugriffsrechte des Ordners sind wie gesagt 755 (Alle Rechte für den Besitzer; Lese- und Ausführrechte für andere). Ich bin wirklich am Verzweifeln. Wer kann mir helfen?

Und die Rechte für die Datei selbst ?!

Ich zitiere deine Fehlermeldung: "No such file or directory in /users/example/www/blabla/another_blabla/example.php"

Gibt es die Datei also überhaupt?
 
Die Datei example.php hat ebenfalls diese Rechte (755). Es kann wirklich nicht an der Berechtigung liegen, denke ich mal.
Irgendetwas muss an meinem code falsch sein. Kann man PHP dann nicht irgendwie noch anders mitteilen, bewusst eine Textdatei zu erstellen? Oder haben sich sonst noch Fehler eingeschlichen?

Edit:
Gibt es die Datei also überhaupt?
Den Pfad habe ich zur Erläuterung hier natürlich abgeändert. Auch ist meine IP-Adresse nicht "[hier meine IP-Adresse]". Aber die Datei example.php existiert, sonst würde ich ja auch den 404-Fehler vom Server zurückbekommen.
 
Werbung:
Die Datei example.php hat ebenfalls diese Rechte (755). Es kann wirklich nicht an der Berechtigung liegen, denke ich mal.
Irgendetwas muss an meinem code falsch sein. Kann man PHP dann nicht irgendwie noch anders mitteilen, bewusst eine Textdatei zu erstellen? Oder haben sich sonst noch Fehler eingeschlichen?

Edit:

Den Pfad habe ich zur Erläuterung hier natürlich abgeändert. Auch ist meine IP-Adresse nicht "[hier meine IP-Adresse]". Aber die Datei example.php existiert, sonst würde ich ja auch den 404-Fehler vom Server zurückbekommen.

Das ist mir schon klar dass die Ordner nicht so heißen... aber habe ich die Fehlermeldung ausgegeben oder dein PHP-Programm?

Unabhängig davon ob die Ordner so heißen oder nicht sagt PHP dass "diese Datei oder Ordner nicht existiert"!
Entweder existiert sie also wirklich nicht oder es fehlen die Rechte - Punkt!
 
Das ist mir schon klar dass die Ordner nicht so heißen... aber habe ich die Fehlermeldung ausgegeben oder dein PHP-Programm?

Unabhängig davon ob die Ordner so heißen oder nicht sagt PHP dass "diese Datei oder Ordner nicht existiert"!
Entweder existiert sie also wirklich nicht oder es fehlen die Rechte - Punkt!

Vl kommst du ja damit weiter...
PHP:
if(!is_file($filename)) { // create file if not exists
  fclose(fopen($filename,"x"));
}
 
Es könnte vielleicht sein dass der Apache und PHP unter einem anderen Nutzer laufen auf deinem Webspace. Probier mal die Rechte 777. Dann sollte es funktionieren.

Kann man gut hier im letzten Absatz lesen

@scbawik
der Paramter "a" sollte schon richtig sein. Da "x" den Dateizeiger ja jedesmal wieder an den Dateianfang setzt. Und "a" sollte die Datei auch erstellen wenn sie nicht vorhanden ist
 
Werbung:
Oups, jetzt fällt mir mein Fehler auf. Der Pfad zur TXT-Datei existiert natürlich nicht, das "getcwd()" fehlt, um denaktuellen Pfad zu ermittel, und somit den vollen Pfad anzugeben.
Meine PHP-Datei sieht jetzt also so aus:
PHP:
<?php
if(file_exists(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")){
  if(file(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")<=time(s)-300){
/* lösche Inhalt von Textdatei */
  fclose(fopen(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", 'w'));
  goto nextstep;
  }else{
  echo 'Irgendein bloedsinniger Fehler ist aufgetreten, da Sie bereits zu viele Kommentare geschreiben haben, oder so. Das tut uns leid, jetzt noch ein sarkastisches Trauer-Smiley ":(" und Schluss - Versuchen Sie\'s halt spaeter noch mal. ';
  exit;
  }
}else{

nextstep:

$txt = fopen(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", "a");
fwrite($txt, time());
fclose($txt);


/* hier kommt dann irgendeine daemliche Funktion, also der Post des Kommentars, oder hier beispielhaft ein echo */
echo "Yes, you did it!";
}
?>

Vielen vielen dank euch allen. ;) Jetzt klappt's.:)
Dass solche kleinen Fehler aber einen auch so leich zum Verzweifeln bringen können...


Aber jetzt habe ich ein neues Problem. Jetzt bekomme ich zwar beim ersten mal "Yes, you did it!" und beim zweiten mal die andere Fehlermeldung angezeigt, jedoch bekomme ich diese auch noch nach 5 Minuten und mehr angezeigt. Das heißt aslo, dass der Teil
PHP:
if(file(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt")<=time(s)-300){
/* lösche Inhalt von Textdatei */
  fclose(fopen(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt", 'w'));
  goto nextstep;
  }
nicht funktioniert. Warum nicht? Ist was falsch dran?
 
Okay, und ich weiß auch schon was. Mit
PHP:
<?php
echo file(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt");
?>
bekomme ich "Array" als Output. Es müsste aber eigentlich "1406711686" sein, der Inhalt der Textdatei. Wie kann ich also den Inhalt der Textdatei mit dem Wert time(s)-300 vergleich?
 
Es könnte vielleicht sein dass der Apache und PHP unter einem anderen Nutzer laufen auf deinem Webspace. Probier mal die Rechte 777. Dann sollte es funktionieren.

Kann man gut hier im letzten Absatz lesen

@scbawik
der Paramter "a" sollte schon richtig sein. Da "x" den Dateizeiger ja jedesmal wieder an den Dateianfang setzt. Und "a" sollte die Datei auch erstellen wenn sie nicht vorhanden ist

"x" erstellt die Datei wenn sie nicht existiert und schmeißt einen Fehler wenn sie bereits existieren sollte.
Dieser Abschnitt war dafür gedacht, dass die Datei jedenfalls existiert bevor das eigentliche fopen stattfindet.
 
Werbung:
Also entweder du liest dich etwas ein wie man mit Arrays arbeitet, denn file() liefert dir ein Array zurück. Du könntest nun mal folgendes machen

PHP:
$inhalt = file(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt");
echo $inhalt[0];

ansonsten lass dir das Array mal ausgeben mit print_r($inhalt);

Du könntest aber auch mit Strings arbeiten, dafür müsstest du anstelle von file() mit file_get_contents() arbeiten

@scbawik
Ahh, habs denn falsch aufgenommen :)
 
Okay, und ich weiß auch schon was. Mit
PHP:
<?php
echo file(getcwd()."/meine-dateien/timestamp-".$_SERVER['REMOTE_ADDR'].".txt");
?>
bekomme ich "Array" als Output. Es müsste aber eigentlich "1406711686" sein, der Inhalt der Textdatei. Wie kann ich also den Inhalt der Textdatei mit dem Wert time(s)-300 vergleich?

$data = file(…);
echo $data[0];

steht alles hier:
http://php.net/manual/de/function.file.php
 
Werbung:
Zurück
Oben