Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Losowy błąd generowania tabelki fwrite
Moris299
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 19.11.2012
Skąd: Bydgoszcz

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


Sprawa wygląda tak:
mam kod który pobiera od użytkownika ip, host i referera a następnie umieszcza w tabelce
kod tabelki jednak lubi się w losowym momencie wykrzyaczyć, o tak:
http://i.imgur.com/0hzefw9.png

tzn kolejne tabele zaczynają wchodzić w tabelę wcześniej
http://i.imgur.com/RbDPkLN.png

i tak po kilkuset wejściach potrafi się umieścić kilka tabel w jednej tabeli i wszystko się rozlatuje
za pierwszym razem popsuło się po 42 wpisach a za drugim po 83

skąd to się bierze? czemu tak się dzieje?
  1. <?php
  2. //pozyskanie informacji z $_SERVER i załadowanie ich do zmiennych
  3. date_default_timezone_set('Europe/Warsaw');
  4. $agent = $_SERVER['HTTP_USER_AGENT'] . "\n\n";
  5. $ip = $_SERVER['REMOTE_ADDR'] . "\n\n";
  6. $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  7. $data = date('j-n-Y H:i:s');
  8. $ref = $_SERVER['HTTP_REFERER'];
  9. $ref_licz = strlen($ref);
  10. if($ref_licz == 0) {
  11. $ref = 'brak informacji o HTTP referer';
  12. }
  13. $br = '<br />';
  14.  
  15.  
  16.  
  17. // wpis
  18. // przypisanie zmniennej $file nazwy pliku
  19. $file = "adresy_ip.html";
  20. // uchwyt pliku, otwarcie do dopisania
  21. $fp = fopen($file, "a+");
  22. // blokada pliku do zapisu
  23. flock($fp, 2);
  24.  
  25. // zapisanie danych do pliku
  26.  
  27. fwrite($fp, '<hr><table style="border: 0px solid black;"><tr><td class="ab"><b>Data i godzina:</b></td><td> ');
  28. fwrite($fp, "$data ");
  29. fwrite($fp, '</td></tr><tr><td class="ab"><b>User Agent:</b></td><td>');
  30. fwrite($fp, "$agent");
  31. fwrite($fp, '</tr><tr><td class="ab"><b>IP:</b></td><td>');
  32. fwrite($fp, "$ip");
  33. fwrite($fp, '</td></tr><tr><td class="ab"><b>Host:</b></td><td>');
  34. fwrite($fp, "$host");
  35. fwrite($fp, '</td></tr><tr><td class="ab"><b>Referer:</b></td><td>');
  36. fwrite($fp, "$ref");
  37. fwrite($fp, '</td></tr></table><hr>');
  38.  
  39.  
  40. // odblokowanie pliku
  41. flock($fp, 3);
  42.  
  43. // zamknięcie pliku
  44. fclose($fp);
  45.  
  46.  
  47. ?>
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Z tego powodu, że niepoprawnie otwierasz/zamykasz znaczniki. Choćby w linii 29.
Gdybyś prześledził źródło wygenerowanej strony, zauważyłbyś.


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





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 19.11.2012
Skąd: Bydgoszcz

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


faktycznie facepalmxd.gif

ale w 29 linijce nie mogę namierzyć błędu? poprawiłem za to 31

  1. fwrite($fp, '<hr><table style="border: 0px solid black;"><tr><td class="ab"><b>Data i godzina:</b></td><td> ');
  2. fwrite($fp, "$data ");
  3. fwrite($fp, '</td></tr><tr><td class="ab"><b>User Agent:</b></td><td>');
  4. fwrite($fp, "$agent");
  5. fwrite($fp, '</td></tr><tr><td class="ab"><b>IP:</b></td><td>');
  6. fwrite($fp, "$ip");
  7. fwrite($fp, '</td></tr><tr><td class="ab"><b>Host:</b></td><td>');
  8. fwrite($fp, "$host");
  9. fwrite($fp, '</td></tr><tr><td class="ab"><b>Referer:</b></td><td>');
  10. fwrite($fp, "$ref");
  11. fwrite($fp, '</td></tr></table><hr>');
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Tak. Otwierałeś w linii 29 <td> bez zamknięcia w 31.


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





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 19.11.2012
Skąd: Bydgoszcz

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


Ok, dzięki smile.gif

zresetowałem
adresy_ip.html

ruch na mojej stronce jest na tyle duży, że za kilka minut już będę w stanie powiedzieć czy pomogło smile.gif



nadal się psuje :/

Skopiowałem kod, skasowałem wszystkie elementy php i zostawiłem sam HTML oraz dodałem wcięcia i wynik jest taki, że kod jest poprawny, Walidator też nie zwraca błędu. Czyli jednak nie w składni HTML jest problem tylko gdzieś z PHP ale nie mam pojęcie gdzie i czemu :/

  1. <table style="border: 0px solid black;">
  2. <tr>
  3. <td class="ab">
  4. <b>Data i godzina:</b>
  5. </td>
  6. <td>
  7. $data
  8. </td>
  9. </tr>
  10. <tr>
  11. <td class="ab">
  12. <b>User Agent:</b>
  13. </td>
  14. <td>
  15. $agent
  16. </td>
  17. </tr>
  18. <tr>
  19. <td class="ab">
  20. <b>IP:</b>
  21. </td>
  22. <td>
  23. $ip
  24. </td>
  25. </tr>
  26. <tr>
  27. <td class="ab">
  28. <b>Host:</b>
  29. </td>
  30. <td>
  31. $host
  32. </td>
  33. </tr>
  34. <tr>
  35. <td class="ab">
  36. <b>Referer:</b>
  37. </td>
  38. <td>
  39. $ref
  40. </td>
  41. </tr>
  42. </table>
Go to the top of the page
+Quote Post
Damonsson
post
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Po prostu lock puszcza Ci pewnie gdzieś w połowie. Daj sobie IFa czy jest lock/unlock i wtedy ładuj dane wewnątrz IFa.

  1. if (flock($fp, LOCK_EX)) {
  2. fwrite($fp, '<hr><table style="border: 0px solid black;"><tr><td class="ab"><b>Data i godzina:</b></td><td> ');
  3. fwrite($fp, "$data ");
  4. fwrite($fp, '</td></tr><tr><td class="ab"><b>User Agent:</b></td><td>');
  5. fwrite($fp, "$agent");
  6. fwrite($fp, '</tr><tr><td class="ab"><b>IP:</b></td><td>');
  7. fwrite($fp, "$ip");
  8. fwrite($fp, '</td></tr><tr><td class="ab"><b>Host:</b></td><td>');
  9. fwrite($fp, "$host");
  10. fwrite($fp, '</td></tr><tr><td class="ab"><b>Referer:</b></td><td>');
  11. fwrite($fp, "$ref");
  12. fwrite($fp, '</td></tr></table><hr>');
  13. flock($fp, LOCK_UN);
  14. }
  15.  


Ten post edytował Damonsson 18.01.2017, 01:19:00
Go to the top of the page
+Quote Post
Moris299
post
Post #7





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 19.11.2012
Skąd: Bydgoszcz

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


to może zamiast ifa przed każdym fwrite dać lepiej locka przed każdym fwritem?
jest jakaś zasada, że lock bedzie trzymał tylko przez ileś tam pleceń?

Dodane 19:51 18-01-2017:

dobra najwyżej przerobię to tak by wpisywało do mysqla zamiast do pliku wink.gif
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%)
-----


A możesz mi powiedzieć po co te kombinacje z fwrite?

Można dużo prościej:

  1. <?php
  2. date_default_timezone_set('Europe/Warsaw');
  3. $agent = $_SERVER['HTTP_USER_AGENT'] . "\n\n";
  4. $ip = $_SERVER['REMOTE_ADDR'] . "\n\n";
  5. $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  6. $data = date('j-n-Y H:i:s');
  7. $ref = $_SERVER['HTTP_REFERER'];
  8. $ref_licz = strlen($ref);
  9. if($ref_licz == 0) {
  10. $ref = 'brak informacji o HTTP referer';
  11. }
  12. $br = '<br />';
  13.  
  14.  
  15. $table = "<hr><table style=\"border: 0px solid black;\"><tr><td class=\"ab\"><b>Data i godzina:</b></td><td>
  16. $data
  17. </td></tr><tr><td class=\"ab\"><b>User Agent:</b></td><td>
  18. $agent
  19. </tr><tr><td class=\"ab\"><b>IP:</b></td><td>
  20. $ip
  21. </td></tr><tr><td class=\"ab\"><b>Host:</b></td><td>
  22. $host
  23. </td></tr><tr><td class=\"ab\"><b>Referer:</b></td><td>
  24. $ref
  25. </td></tr></table><hr>";
  26.  
  27. file_put_contents('adresy_ip.html', $table, FILE_APPEND | LOCK_EX);
  28.  
Go to the top of the page
+Quote Post
Moris299
post
Post #9





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 19.11.2012
Skąd: Bydgoszcz

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


pomogło, dzięki
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: 20.08.2025 - 20:30