Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Podwójnie wpisywane dane w fputs()
Vexis
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Witam,

męczę się już kilka godzin z zagadnieniem dotyczącym zapisywania do pliku. Znalazłem w google tematy ludzi z podobnym problemem, ale nigdzie nie znalazłem rozwiązania, które u mnie by pomogło. Kłopotliwy kod:

  1. ...
  2. $plik = fopen($sciezka, "a");
  3.  
  4. ...
  5.  
  6. fputs($plik, $faktura);
  7. fclose($plik);
  8. //file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);
  9. ...


Problem polega na tym, że dane wpisane do pliku niezależnie od metody fputs (fwrite) czy file_put_contents są zdublowane. Zależy mi, żeby dane dopisywały się na końcu i zawsze dzieje się to podwójnie. Sprawdziłem i jestem pewien, że nigdzie w kodzie nie ma podwójnie wywołanej funkcji. Cały kod wykonuje się raz, a fputs zachowuje się jakby została wywołana podwójnie. Sprawdzałem i przełączyłem fopen w tryb "r+", użyłem fseek, żeby się przesunąć na koniec pliku i zauważyłem coś ciekawego. Jak jestem na końcu pliku i próbuje coś wpisać to się dubluje, jak się przesunę od końca na więcej niż potrzeba na wpisane danych to problem nie występuje. Wygląda na to, że w momencie kiedy "kończy" się plik to dane wpisywane są ponownie. Testowałem różne przeglądarki i różne komputery, wszędzie ten sam problem.

Nie mam już pomysłu jak to naprawić. Kombinowałem, żeby może po zapisie kasować z pliku dane, ale żeby to zrobić to muszę ponownie zapisać poprawione dane, które ponownie się dublują... Ktoś ma jakiś pomysł?

Ten post edytował Vexis 7.04.2017, 12:53:09
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Jak jestem na końcu pliku i próbuje coś wpisać to się dubluje, jak się przesunę od końca na więcej niż potrzeba na wpisane danych to problem nie występuje.
Bo jak przesuwasz za kazdym razem powiedzmy 10 do tylu, a tekst ma dlugosc 5 to chocbys i go 100 razy odpalil to zawsze bedziesz widzial swoj wpis tylko raz bo tekst w pliku jest nadpisywany a nie dopisywany.

Twoj kod odpala sie dwa razy i tyle. Chocby przez jakies mod rewrite czy inne podobne sytuacje. Ciezko wywrozyc nie majac calosci.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Vexis
post
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 7.04.2017, 13:58:26 ) *
Bo jak przesuwasz za kazdym razem powiedzmy 10 do tylu, a tekst ma dlugosc 5 to chocbys i go 100 razy odpalil to zawsze bedziesz widzial swoj wpis tylko raz bo tekst w pliku jest nadpisywany a nie dopisywany.

Twoj kod odpala sie dwa razy i tyle. Chocby przez jakies mod rewrite czy inne podobne sytuacje. Ciezko wywrozyc nie majac calosci.


Owszem wywołuje się dwa razy, ale tylko i wyłącznie fputs(), niżej w kodzie mam alerta i pojawia się tylko raz. Wszystko poza tym wykonuje się raz. Wpis na końcu pliku zawsze zdublowany :/
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zrozum, alerta widzisz raz, bo to masz jako glowne żądanie. A gdzies w tle moze leciec dodatkowe żądanie, ktorego wyniku juz nie widzisz. A moze leciec np. przez zle zrobiony mod_rewrite i przekierowuje sie do skryptu gdy nie ma jakiegos css, js czy image. Wielokrotnie to sie na forum powtarzalo i wszyscy jak ty teraz sie upierali ze nic takiego sie nie dzieje a jednak zawsze sie dzialo. Do wyjatkow nie nalezysz wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Vexis
post
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


No właśnie chcę zrozumieć, ale chyba mi coś nie idzie... Ten plik który tworze ma za zadanie wyeksportować dane do pliku txt, te dane kolejną są wpisywanie w zmienną. Wszystko działa idealnie. Czemu w takim układzie w momencie wpisywania do pliku zawartości zmiennej ta wartość się dubluje? Jakbyś mógł bez nerwów mi pomóc to zrozumieć to będę Ci bardzo wdzięczny.

Edit:
Próba fputs($plik, 'test');
daje takie same efekty.

Ten post edytował Vexis 7.04.2017, 13:19:52
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


To teraz dodaj sobie

Kod
file_put_contents('test.log', var_export($_SERVER, true), FILE_APPEND);

przed fputs()

i po requeście pokaż wynik.
Go to the top of the page
+Quote Post
Vexis
post
Post #7





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 7.04.2017, 14:30:57 ) *
To teraz dodaj sobie

Kod
file_put_contents('test.log', var_export($_SERVER, true), FILE_APPEND);

przed fputs()

i po requeście pokaż wynik.


Jeżeli dobrze rozumiem to testowałem wcześniej:

  1. file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);


co również dubluje mi dane w pliku wyjściowym.

Ten post edytował Vexis 7.04.2017, 13:34:40
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


To teraz potrenj czytanie ze zrozumieniem...
Go to the top of the page
+Quote Post
Vexis
post
Post #9





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 7.04.2017, 14:35:52 ) *
To teraz potrenj czytanie ze zrozumieniem...


Mój błąd.

  1. 'HTTP_HOST' => '192.168.111.76',
  2. 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
  3. 'HTTP_ACCEPT' => '*/*',
  4. 'HTTP_ACCEPT_LANGUAGE' => 'pl,en-US;q=0.7,en;q=0.3',
  5. 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
  6. 'HTTP_BS_EDOK_REFERER' => '---',
  7. 'HTTP_BS_EDOK_JS_TOK' => '---',
  8. 'CONTENT_TYPE' => 'application/x-www-form-urlencoded;',
  9. 'HTTP_REFERER' => '---',
  10. 'CONTENT_LENGTH' => '1909',
  11. 'HTTP_COOKIE' => '---',
  12. 'HTTP_CONNECTION' => 'keep-alive',
  13. 'PATH' => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
  14. 'SERVER_SIGNATURE' => '',
  15. 'SERVER_SOFTWARE' => 'Apache/2.4.10 (Debian)',
  16. 'SERVER_NAME' => '192.168.111.76',
  17. 'SERVER_ADDR' => '192.168.111.76',
  18. 'SERVER_PORT' => '80',
  19. 'REMOTE_ADDR' => '192.168.111.62',
  20. 'DOCUMENT_ROOT' => '---',
  21. 'REQUEST_SCHEME' => 'http',
  22. 'CONTEXT_PREFIX' => '---',
  23. 'CONTEXT_DOCUMENT_ROOT' => '---',
  24. 'SERVER_ADMIN' => '---',
  25. 'SCRIPT_FILENAME' => '---/fservice.php',
  26. 'REMOTE_PORT' => '60701',
  27. 'GATEWAY_INTERFACE' => 'CGI/1.1',
  28. 'SERVER_PROTOCOL' => 'HTTP/1.1',
  29. 'REQUEST_METHOD' => 'POST',
  30. 'QUERY_STRING' => '',
  31. 'REQUEST_URI' => '---',
  32. 'SCRIPT_NAME' => '---/fservice.php',
  33. 'PATH_INFO' => '---',
  34. 'PATH_TRANSLATED' => '---',
  35. 'PHP_SELF' => '---',
  36. 'REQUEST_TIME_FLOAT' => 1491568864.562,
  37. 'REQUEST_TIME' => 1491568864,
  38. )


Wybacz, ale musiałem wyciąg dane zawierające informacje o kliencie.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


No i co, dodało się raz...
to teraz w tym twoim:
Kod
file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);

zamień na
file_put_contents($sciezka, var_export($_SERVER, true), FILE_APPEND | LOCK_EX);

i j.w wynik...
Go to the top of the page
+Quote Post
Vexis
post
Post #11





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 7.04.2017, 14:50:08 ) *
No i co, dodało się raz...
to teraz w tym twoim:
Kod
file_put_contents($sciezka, 'testowy string'.PHP_EOL, FILE_APPEND | LOCK_EX);

zamień na
file_put_contents($sciezka, var_export($_SERVER, true), FILE_APPEND | LOCK_EX);

i j.w wynik...


Dodało się dwa razy tylko ja skopiowałem jeden egzemplarz :/
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Dodało się dwa razy tylko ja skopiowałem jeden egzemplarz :/
Wiec masz kolejny dowod na to, ze mowie prawde tongue.gif Twoj kod jest wykonywany dwa razy. Potencjalne powody tego stanu juz ci podalem


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Vexis
post
Post #13





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 7.04.2017, 15:07:03 ) *
Wiec masz kolejny dowod na to, ze mowie prawde tongue.gif Twoj kod jest wykonywany dwa razy. Potencjalne powody tego stanu juz ci podalem


Okej, przyjmuje to do wiadomości, ale nie potrafię zrozumieć czemu akurat funkcje wpisujące coś to pliku wykonują się dwa razy. Nie jestem administratorem serwera na którym to wszystko stoi, więc nie jestem w stanie tego zweryfikować :/

Skoro nie jestem w stanie naprawić problemu to może da się go obejść? Zastanawiam się czy można jakoś usunąć duplikat z pliku tak, żeby nie używać fwrite ponownie.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


facepalmxd.gif sciana.gif No po co ja pisałem żebyś wysłał zawartośc pliku... no po co...

wklej tutaj: https://www.diffchecker.com/
po lewej 1sze wystąpienie array a po prawej drugie i pokaż diff wygenerowany....


Załamałeś mnie....

Zmieniłem zdanie... Wyślij wynik mi na PW bez zamazywania (no chyba że oba są dokładnie takie same)...

Ten post edytował Pyton_000 7.04.2017, 14:17:46
Go to the top of the page
+Quote Post
viking
post
Post #15





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Pokaz adres jesli jest publicznie dostepny.


--------------------
Go to the top of the page
+Quote Post
Vexis
post
Post #16





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 7.04.2017, 15:14:29 ) *
facepalmxd.gif sciana.gif No po co ja pisałem żebyś wysłał zawartośc pliku... no po co...

wklej tutaj: https://www.diffchecker.com/
po lewej 1sze wystąpienie array a po prawej drugie i pokaż diff wygenerowany....


Załamałeś mnie....

Zmieniłem zdanie... Wyślij wynik mi na PW bez zamazywania (no chyba że oba są dokładnie takie same)...


Wybacz, myślałem, że interesują Cię informacje a nie to czy jest zdublowane. Wpis jest podwójny, identyczny, tak jak wcześniej. Nie ma powodu to wściekania się, serio...

Cytat(viking @ 7.04.2017, 15:14:36 ) *
Pokaz adres jesli jest publicznie dostepny.


Niestety nie mam jak, całość stoi na testowym serwerze firmowym bez dostępu z zewnątrz w tym przypadku :/

Edit:
Sprawdziłem na prywatnym serwerze i wszystko działa prawidłowo, bez dublowania. Także macie w pełni racje - wina leży po stronie serwera firmowego. Ktoś ma może pomysł gdzie dokładnie szukać przyczyny? Nie jestem administratorem tamtego serwera, więc potrzebuje punktu zaczepienia, żeby wskazać adminowi.

Ten post edytował Vexis 8.04.2017, 07:17:01
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Ktoś ma może pomysł gdzie dokładnie szukać przyczyny? Nie jestem administratorem tamtego serwera, więc potrzebuje punktu zaczepienia, żeby wskazać adminowi.
Podalem ci jedna z przyczyn


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Vexis
post
Post #18





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 8.04.2017, 11:39:53 ) *
Podalem ci jedna z przyczyn


"mod rewrite " - widziałem i dziękuje za pomoc. W poniedziałek spróbuje coś w tym kierunku wskórać.

Czy przychodzą Ci do głowy jeszcze inne możliwości?

//////

Dowiedziałem się, że podwójne wykonywanie kodu w miejscu w którym pisałem swój kod (rozszerzenie klasy) jest jak najbardziej prawidłową i pożądaną funkcjonalnością w związku z czym udało mi się obejść problem w sposób bardzo nieelegancji, aczkolwiek dla moich potrzeb skuteczny.

  1. public function zapis($sciezka, $faktura) {
  2. if (!file_exists($sciezka.'1.txt')) {
  3. $plik = fopen($sciezka.'1.txt', "w"); // otwarcie pliku
  4. flock($plik, LOCK_EX); // blokada pliku do zapisu
  5. fwrite($plik, $faktura); // zapis do pliku
  6. flock($plik, LOCK_UN); // zwolnienie blokady
  7. fclose($plik); // zamkniecie pliku
  8. } elseif (!file_exists($sciezka.'2.txt')) {
  9. $plik = fopen($sciezka.'2.txt', "w");
  10. fclose($plik);
  11. } elseif (file_exists($sciezka.'2.txt') AND !file_exists($sciezka.'3.txt')) {
  12. $plik = fopen($sciezka.'2.txt', "r+"); // otwarcie pliku
  13. flock($plik, LOCK_EX); // blokada pliku do zapisu
  14. fwrite($plik, $faktura); // zapis do pliku
  15. flock($plik, LOCK_UN); // zwolnienie blokady
  16. fclose($plik); // zamkniecie pliku
  17. $plik = fopen($sciezka.'3.txt', "w");
  18. fclose($plik);
  19. } elseif (file_exists($sciezka.'3.txt')) {
  20. $plik = fopen($sciezka.'3.txt', "w"); // otwarcie pliku
  21. flock($plik, LOCK_EX); // blokada pliku do zapisu
  22. fwrite($plik, $faktura); // zapis do pliku
  23. flock($plik, LOCK_UN); // zwolnienie blokady
  24. fclose($plik); // zamkniecie pliku
  25. }
  26. }


W związku z powyższym dziękuje za pomoc i proszę o zamknięcie tematu.

Ten post edytował Vexis 13.04.2017, 06:06:16
Go to the top of the page
+Quote Post
Pyton_000
post
Post #19





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Po prostu zajebiste rozwiązanie.... Palce lizać... Gdybyśmy razem pracowali to dostałbyś takiego kopa za to że nie dałbyś rady siedzieć przez cały dzień...
Go to the top of the page
+Quote Post
Vexis
post
Post #20





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 7.04.2017

Ostrzeżenie: (0%)
-----


Poradziłem sobie tak jak na tę chwile potrafię. Nie jestem w stanie zablokować podwójnego wykonywania kodu. Nie znam żadnego programisty, który wspomógłby radą, więc improwizuje. Chyba wolałbym tego kopa dostać, bo pewnie bym się czegoś od Ciebie nauczył w związku z tym :-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 12:27