Ich habe eine Website, die jedes Mal, wenn sich ein Benutzer anmeldet oder abmeldet, in einer Textdatei gespeichert wird.
Mein Code funktioniert nicht beim Anhängen von Daten oder beim Erstellen einer Textdatei, wenn diese nicht vorhanden ist. Hier ist der Beispielcode
$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);
Es scheint, dass es nicht an die nächste Zeile angehängt wird, nachdem ich es wieder geöffnet habe.
Ich denke auch, dass es auch einen Fehler geben würde, wenn sich 2 Benutzer gleichzeitig anmelden. Würde dies das Öffnen der Textdatei und das anschließende Speichern beeinträchtigen?
logs.txt
und fügt den Inhalt darin hinzuVerwenden Sie den
a
Modus. Es steht fürappend
.quelle
a
Flag erstellt die Datei, wenn sie nicht vorhanden ist, und spielt unabhängig davon, ob Sie wirklichappend
neuen Text verwenden. Für das\n
funktioniert es aber nur, wenn in doppelten Anführungszeichen"
keine einfachen Anführungszeichen stehen'
Sie können es auf OO-Weise tun, nur eine Alternative und flexibel:
Verwenden Sie es dann folgendermaßen. Nehmen wir an, Sie haben
user_name
in einer Sitzung gespeichert (Semi-Pseudo-Code):Überprüfen Sie Ihr Protokoll damit:
Ergebnis ist wie:
github.com/thielicious/Logger
quelle
quelle
Versuchen Sie diesen Code:
Ich benutze es immer so und es funktioniert ...
quelle
(!file_exists($logPath)) ? 'w':'a'
- diea
Option hat bereits das richtige Verhalten, wenn keine Datei vorhanden ist. Sie können diese Antwort also vereinfachen, indem Sie die Zeile entfernen$mode = ...;
und die nächste Zeile in ändern$logfile = fopen($logPath, 'a');
.Es gibt keinen solchen Dateiöffnungsmodus wie "wr" in Ihrem Code:
Die Modi zum Öffnen von Dateien in PHP http://php.net/manual/en/function.fopen.php sind dieselben wie in C: http://www.cplusplus.com/reference/cstdio/fopen/
Es gibt die folgenden Hauptöffnungsmodi "r" zum Lesen, "w" zum Schreiben und "a" zum Anhängen, und Sie können sie nicht kombinieren. Sie können andere Modifikatoren wie "+" für die Aktualisierung und "b" für die Binärdatei hinzufügen. Der neue C-Standard fügt einen neuen Standard-Subspezifizierer ("x") hinzu, der von PHP unterstützt wird und an jeden "w" -Spezifizierer angehängt werden kann (um "wx", "wbx", "w + x" oder "w + bx" zu bilden "/" wb + x "). Dieser Subspezifizierer erzwingt, dass die Funktion fehlschlägt, wenn die Datei vorhanden ist, anstatt sie zu überschreiben.
Außerdem wurde in PHP 5.2.6 der Hauptöffnungsmodus 'c' hinzugefügt. Sie können 'c' nicht mit 'a', 'r', 'w' kombinieren. Das 'c' öffnet die Datei nur zum Schreiben. Wenn die Datei nicht vorhanden ist, wird sie erstellt. Wenn es existiert, wird es weder abgeschnitten (im Gegensatz zu 'w'), noch schlägt der Aufruf dieser Funktion fehl (wie dies bei 'x' der Fall ist). 'c +' Öffne die Datei zum Lesen und Schreiben. ansonsten hat es das gleiche Verhalten wie 'c'.
Zusätzlich und in PHP 7.1.2 wurde die Option 'e' hinzugefügt, die mit anderen Modi kombiniert werden kann. Es setzte das Close-on-Exec-Flag im geöffneten Dateideskriptor. Nur in PHP verfügbar, das auf POSIX.1-2008-konformen Systemen kompiliert wurde.
Für die Aufgabe, wie Sie sie beschrieben haben, wäre der beste Modus zum Öffnen von Dateien "a". Es öffnet die Datei nur zum Schreiben. Es platziert den Dateizeiger am Ende der Datei. Wenn die Datei nicht vorhanden ist, wird versucht, sie zu erstellen. In diesem Modus hat fseek () keine Auswirkung, Schreibvorgänge werden immer angehängt.
Folgendes benötigen Sie, wie oben bereits erwähnt:
quelle
Obwohl es viele Möglichkeiten gibt, dies zu tun. Aber wenn Sie es auf einfache Weise tun und Text formatieren möchten, bevor Sie ihn in eine Protokolldatei schreiben. Hierfür können Sie eine Hilfsfunktion anlegen.
quelle