Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Losowy błąd generowania tabelki fwrite
Forum PHP.pl > Forum > Przedszkole
Moris299
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. ?>
trueblue
Z tego powodu, że niepoprawnie otwierasz/zamykasz znaczniki. Choćby w linii 29.
Gdybyś prześledził źródło wygenerowanej strony, zauważyłbyś.
Moris299
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>');
trueblue
Tak. Otwierałeś w linii 29 <td> bez zamknięcia w 31.
Moris299
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>
Damonsson
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.  
Moris299
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
Pyton_000
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.  
Moris299
pomogło, dzięki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.