Mam stronę internetową, na której za każdym razem, gdy użytkownik się loguje lub wylogowuje, zapisuję ją do pliku tekstowego.
Mój kod nie działa w zakresie dołączania danych lub tworzenia pliku tekstowego, jeśli nie istnieje. Oto przykładowy kod
$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);
Wygląda na to, że nie jest dołączany do następnego wiersza po ponownym otwarciu.
Myślę też, że miałoby to również błąd w sytuacji, gdy loguje się 2 użytkowników w tym samym czasie, czy wpłynęłoby to na otwarcie pliku tekstowego i późniejsze jego zapisanie?
logs.txt
iUżyj
a
trybu. To oznaczaappend
.źródło
a
flaga stworzy plik, jeśli nie istnieje i nie będzie ważne, co się upewnić, że naprawdęappend
nowy tekst. Aby\n
to działa, ale tylko wtedy, gdy wewnątrz cudzysłowach"
nie pojedyncze cytaty'
Możesz to zrobić na sposób OO, tylko alternatywnie i elastycznie:
Następnie użyj tego w ten sposób ... powiedzmy, że
user_name
zapisałeś w sesji (pół pseudo kod):Sprawdź swój dziennik za pomocą tego:
Wynik jest taki:
github.com/thielicious/Logger
źródło
źródło
Wypróbuj ten kod:
Zawsze go tak używam i działa ...
źródło
(!file_exists($logPath)) ? 'w':'a'
-a
opcja już działa poprawnie, gdy plik nie istnieje. Więc można uprościć tę odpowiedź, usuwając linię$mode = ...;
i zmieniając następną linię na$logfile = fopen($logPath, 'a');
.W Twoim kodzie nie ma takiego trybu otwierania plików jak „wr”:
Tryby otwierania plików w PHP http://php.net/manual/en/function.fopen.php są takie same jak w C: http://www.cplusplus.com/reference/cstdio/fopen/
Istnieją następujące główne otwarte tryby „r” do odczytu, „w” do zapisu i „a” do dołączania i nie można ich łączyć. Możesz dodać inne modyfikatory, takie jak „+” dla aktualizacji, „b” dla binarnego. Nowy standard C dodaje nowy standardowy specyfikator („x”), obsługiwany przez PHP, który można dołączyć do dowolnego specyfikatora „w” (aby utworzyć „wx”, „wbx”, „w + x” lub „w + bx „/„ wb + x ”). Ten subspecifier wymusza niepowodzenie funkcji, jeśli plik istnieje, zamiast go nadpisywać.
Poza tym w PHP 5.2.6 dodano główny tryb otwarty „c”. Nie można łączyć „c” z „a”, „r”, „w”. Litera „c” otwiera plik tylko do zapisu. Jeśli plik nie istnieje, zostanie utworzony. Jeśli istnieje, nie jest obcinany (w przeciwieństwie do „w”), ani wywołanie tej funkcji nie kończy się niepowodzeniem (jak w przypadku „x”). „c +” Otwiera plik do czytania i pisania; w przeciwnym razie zachowuje się tak samo jak „c”.
Dodatkowo w PHP 7.1.2 dodano opcję 'e', którą można łączyć z innymi trybami. Ustawia flagę close-on-exec na deskryptorze otwartego pliku. Dostępne tylko w PHP skompilowanym w systemach zgodnych z POSIX.1-2008.
Tak więc dla opisanego zadania najlepszym trybem otwierania plików będzie „a”. Otwiera plik tylko do zapisu. Umieszcza wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje, próbuje go utworzyć. W tym trybie fseek () nie działa, zapisy są zawsze dołączane.
Oto, czego potrzebujesz, jak już wskazano powyżej:
źródło
Chociaż można to zrobić na wiele sposobów. Ale jeśli chcesz to zrobić w łatwy sposób i chcesz sformatować tekst przed zapisaniem go w pliku dziennika. Możesz w tym celu utworzyć funkcję pomocniczą.
źródło