Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapobieganie floodowi
Forum PHP.pl > Forum > Przedszkole
Balon
W skrypcie pisanym przeze mnie jest mozliwosc komentowania newsow ale niestety jak sie wpisze tresc komenta i wysle sie go to po odswiezeniu strony pojawia sie nastepny koment... w jaki sposob temu zapobiec ? probowalem za pomoca header ale sie gryzlo to cos ... czy jest inny sposob ? prosze o podawanie przykladow bo jak ktos bedzie proponowal JS to nie bede wiedzial w jaki sposob to zrobic ....

pozdrawiam
crash
Po dodaniu newsa użyj funkcji header( 'Location: ' . $_SERVER[ 'PHP_SELF' ] ); aby przeładować stronę.
Balon
to ja korzystałem z podobnego skryptu ale niestety dostaje komunikat
Kod
Warning: Cannot modify header information - headers already sent by (output started at /home/soonhost/public_html/balon_portfolio/tmp/2/index.php:17) in /home/soonhost/public_html/balon_portfolio/tmp/2/inc/wiecej.php on line 56

chociaz w pliku dalem buforowanie itd...
Nie wiem dlaczego sie tak dzieje bo w panelu admina korzystam z tego samego i działa. Nie chce zadziałać więc zastanawiam się czy jest inne rozwiązanie.
yavaho
Ja mam tak
1) po wysłaniu przeladowanie za pomocą header - i juz nikt mi nie wysle drugi raz to samo naciskajac F5
2) ciasteczko lub sesja - nastepną wiadomosc mozna przeslac po 60s
3) wiadomosci zapisywane sa w bazie danych - wiec mozna sprawdzic czy identyczna tresc + imie znajduje sie juz w bazie danych i wyslanie drugiej identycznej kopi tej widomosci mozna blokowac na 24h.
mike
Większość ludzi poleca buforowanie na ominięcie problemu związanego z "headers already sent". Nawet na wiki tak piszą.

A ja twierdzę że to głupota.

Jak chcesz kogoś przekierować po wykonaniu pewnych operacji to po kiego cos wyświetlasz?

Moja podpowiedź.
Po operacjach (i w czasie) zrezygnuj z jakiegokowiek wyświatlania czegokolwiek a potem przekieruj na stroną, na której poinformujsz o powodzeniu lub niepowodzeniu zapisu.
Radarek
Dokladnie tak samo mysle. I moznaby powiedziec, ze buforowanie jest niepotrzebne, jednak sa sytuacje kiedy sie przydaje. Czasem spotykalem sie ze skryptem w ktorym ciezko bylo sie polapac, gdyz bylo masa blokow if-else (przez co przeplywa sterowania bylo ciezko zalapac:) ), a trzeba bylo uzyc funkcje modyfikujaca naglowek http, co czesto konczylo sie znanym juz komunikatem "headers alredy sent". W takim wypadku, najlatwiejszym wyjsciem (bez analizowania skryptu i babrania sie) bylo dodanie buforowania (ob_start() na poczatku skryptu) i po sprawie.
yavaho
A ja uzywam bardzo czesto ob_start("ob_gzhandler") I tylko ze wzgledu na korzysci ktore wynikają na zmiejszeniu transferu strony.

@Balon instrukcja ob_start(); musi byc na samym poczatku nie tak skryptu, a powiedzial bym ze na poczatku pliku. Jezeli plik kodowany jest w UTF-8 to moze Ci wywalac w/w blad. W takich plikach kodowanych w utf-8 na poczatku pliku czesto przylepiany jest tak zwany BOM.
Najlepiej utworz od nowa plik i wklej do niego zawartosc z tego poprzedniego. I nie zapisuj pliku z kodowaniem utf-8.
Balon
Strona niby nie jest w UTF, a obstart jest na poczatku index.php do ktorego sa includowane podstrony.... Ale nadal nie działa.

EDIT : http://www.ppx.pl/balon_portfolio/tmp/2/in...co=wiecej&id=41 tutaj mozecie sprobowac winksmiley.jpg
crash
Zarzuć kodem, bo nie widać żebyś cokolwiek tam poprawił...
Balon
plik z podgladem newsa (ten w ktorym sa komentarze)
  1. <?
  2. lacz();
  3.  
  4.  
  5. $id = $_GET['id'];
  6.  
  7. if (!$id) {
  8. echo"<table bgcolor=3e3e3e border=0 width=600 align=center cellpadding=0 cellspacin
    g=0>
  9. <tr><td bgcolor=3e3e3e width=100% class=news>Strona wywolana w nieprawidlowy sposob. Poruszaj sie za pomoca linkow.</td></tr>
  10. </table><br>";
  11. }
  12.  
  13. $zapytanie = "SELECT * FROM `newsy` WHERE id = $id";
  14. $wykonaj = mysql_query ($zapytanie);
  15.  
  16. while($row=mysql_fetch_array ($wykonaj)) {
  17.  
  18. echo"<table bgcolor=3e3e3e border=0 width=600 align=center cellpadding=0 cellspacin
    g=0>
  19. <tr><td bgcolor=3e3e3e width=100% class=news><span class=title>$row[title]</span>&nbsp;&nbsp;//&nbsp;&nbsp;$row[data]";
  20. echo" <br>
  21. <font align=justify>".stripslashes($row[tresc])."</font> </td></tr>
  22. <tr><td bgcolor=505050 width=100% height=25 class=news><right><b>Autor:</b> $row[autor]</td></tr>
  23. </table><br>";
  24. }
  25.  
  26. //***********************************/
  27. //  KOMENTARZE /
  28. //***********************************/
  29.  
  30. $ile = 15;
  31. $numrows = mysql_num_rows(mysql_query("SELECT * FROM `komentarze` WHERE id_news = $id"));
  32. if(!is_numeric($p)) $p = 0;
  33. if(!$p) $p = 0;
  34. $zapytanie = "SELECT * FROM `komentarze` WHERE id_news = $id ORDER BY `id` DESC LIMIT $p,
    $ile"
    ;
  35. $wykonaj = mysql_query ($zapytanie);
  36. echo "<table bgcolor=505050 border=0 width=600 align=center cellpadding=0 cellspacin
    g=0>"
    ;
  37. while($row=mysql_fetch_array ($wykonaj)) 
  38. {
  39. echo "<tr><td bgcolor='505050' width='100%' class=news><b>".$row['autor']."</b><br>".stripslashes($row[tresc])."<br></td></tr>";
  40. $i++;
  41. }
  42.  
  43. ?>
  44. <form method="post" action="index.php?co=wiecej&id=<?=$_GET['id']?>">
  45. <table bgcolor=3e3e3e border=0 width=600 align=center cellpadding=0 cellspacin
    g=0 class=news>
  46.  
  47. <?
  48. ####################
  49. # Dodawanie koentów
  50. ####################
  51. if($send=='Skomentuj')
  52. {
  53. if (!isset($id) && !isset($tresc))
  54. {
  55. echo "<tr><td><b>Nie wypełniłeś wszystkich pól.</b></td></tr>";
  56. echo "</table>";
  57. }
  58. if (!ereg('[a-zA-Z0-9-.,]+', $tresc))
  59. {
  60. echo "<tr><td><b>Treść zawiera nieprawidłowe znaki.</b></td></tr>";
  61. echo "</table>";
  62. }
  63. $zapytanie = "INSERT INTO `komentarze` values ('', '$_GET[id]', '$autor', '$tresc')";
  64. $wykonaj = mysql_query ($zapytanie);
  65.  
  66. if (!$wykonaj)
  67. {
  68. echo "<tr><td><b>Komentarz nie mógł zostać dodany</b></td></tr>";
  69. echo "</table>";
  70. }
  71. header ('Location: index.php?co=wiecej');
  72. }
  73.  
  74. ?>
  75. <tr><td>Nick:&nbsp;</td><td><input type="text" class="t1" name="autor"></td></tr>
  76. <tr><td>Tresc:&nbsp;</td><td><TEXTAREA name="tresc" rows="4" cols="30" wrap="virtual" style="font-family:verdana, tahoma, sans-serif; font-size:11px; color:#000066; border: 1px solid #000066"></TEXTAREA></td></tr>
  77. <tr><td>&nbsp;</td><td><input type="submit" value="Skomentuj" name="send" class="t1"></td></tr>
  78. </table>
  79. </form>
  80.  
  81. <?
  82. #### STRONY ####
  83. echo "<table border=0 width=600 align=center cellpadding=0 cellspacing=0 class=news>";
  84. echo "<tr><td align=right class=strona>strona: ";
  85. for($i=0;$i<ceil($numrows/$ile);$i++) {
  86. echo '<a class="a1" href="index.php?co=wiecej&amp;id='.$id.'&amp;p='.($i*$ile).'">'.($i+1).'</a> ';
  87. }
  88. echo "</table>";
  89. ?>


index.php
  1. ?>
  2. <html>
  3. <head>
  4.  
  5. <title>Portal Newsowy - v 1.0.</title>
  6. <link rel="stylesheet" href="style.css" type="text/css" />
  7. <link rel="alternate" type="application/rss+xml" title="Ppx.pl - kanal rss" href="rss.php" />
  8. </head>
  9.  
  10. <body><br>
  11. <table border="0" width="600" height="80" align="center" cellpadding="0" cellspacing="0">
  12. <tr>
  13. <td class="news" bgcolor="#3e3e3e" align="left" valign="middle">
  14. <a href="index.php"><img src="img/top.gif" border="0"></a>
  15. </td>
  16. </tr>
  17. </table>
  18. <table border="0" height="25" width="600" align="center" cellpadding="0" cellspacing="0">
  19. <tr><td width="100%" height="100%"></td></tr>
  20. </table>
  21. <?
  22. if($co=="newsy") { include "inc/newsy.php"; }
  23. elseif($co=="viewprofil") { include "inc/profil.php"; }
  24. elseif($co=="wiecej") { include "inc/wiecej.php"; }
  25. else { include "inc/newsy.php"; }
  26. ?><br>
  27. </body>
  28.  
  29. </html>
  30. <? ob_end_flush(); ?>


Proszę bardzo winksmiley.jpg
Rafiki
<?ob_flush();
?>

moze daj na samym poczatku zamiast tego:
<?php ob_start('ob_gzhandler'); ?>

Rownie dobrze moglbys przebudowac troche skrypt i obylo by sie bez buforowania

Edit:
Mysle ze to nie wersja finalna skryptu bo ja sam ( choc niejestem dobry z php ) zauwazylem dosc powazne bledy w tym dodawaniu komentarzy
crash
1. Nie buforujesz tego co trzeba.
2. Buforowanie zaczynasz od ob_flush()? Ciekawe...
Rafiki
Cytat
1. Nie buforujesz tego co trzeba.


Moze sie myle ( a to mozliwe smile.gif ale jezeli da na samym poczatku pliku index.php ob_start(); a w nim bedzie includowany plik x.php ( a tak widze ze jest ) powinno byc chyba wszystko ok, bo chyba ob_start bedzie tez dotyczyc includowanego pliku, choc nie jestem pewien tongue.gif
Balon
Cytat(crash @ 2006-01-13 20:09:22)
1. Nie buforujesz tego co trzeba.
2. Buforowanie zaczynasz od ob_flush()? Ciekawe...

@Crash - nie wiem jaki błąd popełniłem tutaj. Robiłem tak w panelu admina i działało. Więc czy mógłbym Cię prosić o jakieś wskazówki ?
crash
Rafiki: racja, ale za bardzo tu namieszane i nie widać co jest co.
Balon: aby rozpocząć buforowanie używa się ob_start();
yavaho
@Balon tworzyles nowy plik index.php tak jak ci radziłem?
Utworz zupelnie nowy plik i nazwij go index.php i wklej do niego kod z tego poprzedniego. Chodzi o to abys calkowicie pozbył sie aktualnego pliku index.php Tylko nie rób kopii tego pliku!

I na poczatku daj:
ob_start" title="Zobacz w manualu php" target="_manual();
a na koncu:
ob_end_flush" title="Zobacz w manualu php" target="_manual();

Jezeli na stronie znajdują sie skrypty ktore pożerają duzo zasobów serwera to wtedy mozesz dac gdzieś pomiedzy nimi w środu strony ob_flush" title="Zobacz w manualu php" target="_manual() flush" title="Zobacz w manualu php" target="_manual(); co spowoduje wysyłanie strony do klienta na "raty".


Albo ten kawałek kodu, ktory odpowiedzialny jest za zapisane komentarzy do bazy wydziel do osobnego pliku, ktory nie bedzie includowany i wtedy niepotrzebne bedzie ob_start(), a po zapisaniu danych do bazy i tak przekieruje do index.php. Tylko wtedy trzeba opracowac inny sposob obslugi bledów.
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.