Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> odświeżanie strony, zapis
skowron-line
post 26.03.2006, 21:56:00
Post #1





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


napisalem prosty skrypt dodawania komentarzy na stronke i mam pytanie jak zrobic zeby skrypt nie dodawal ciagle tygo samego po nacisnieciu odswieżania??

----
Posty będące duplikacją postów już zawartych w temacie, będą bez ostrzeżenia usuwane. Ma to zapobiedz tworzeniu się zbędnego śmietnika
moderator


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
be2k
post 26.01.2008, 12:50:49
Post #2





Grupa: Zarejestrowani
Postów: 40
Pomógł: 2
Dołączył: 14.07.2006

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


to moze i ja dorzuce swoje 3 grosze.

# rozwiazanie w stylu js/ajax jest moim zdaniem chybione, bo po co wogole angazowac ajaxa do rzeczy tak banalnej jak wyslanie formularza.

# rozwiazanie z dodawaniem ukrytego pola do formularza po kliknieciu submit w formularzu tez nie bedzie dzialalo, bo klikniecie F5 powoduje wyslanie ponownie TEGO SAMEGO formularza, wiec nie zostanie wyslany nowy z nowo wygenerowanym polem - a chodzi tutaj chyba o zabezpieczenie przez refresh'em a nie ponownym klikaniem w submit.
kolega wczesniej podawal przyklad:
  1. <?php
  2. if(isset($_POST['AddReply']) && !isset($_POST['Re'])) $class->AddReply();
  3. ?>

a w forumularzu:
  1. <form action="" method="post">
  2. <?php if(!empty($_POST)) echo '<input name="Re" type="hidden" value="1">'; ?>
  3. <input name="AddReply" type="hidden" value="1">
  4. ...
  5. </form>

i tak jak napisalem to oczywiscie nie dziala, bo klikniecie F5 (refresh) nie powoduje ponownej generacji formularza czyli pole
  1. <input name="Re" type="hidden" value="1">

nie zostanie wyslane z formularzem

# rozwiazanie z zapisywaniem IP oraz czasu i sprawdzanie czy nowy post jest z tego samego IP co ostatni, jesli tak to ile minelo czasu - jest rowniez niepoprawne. po pierwsze co jesli dodaje dwa posty w roznych topicach w bardzo krotkim czasie? z tym oczywiscie mozna sobie poradzic, bo mozna sprawdzac czy nowy post jest z tego samego topicu czy nie, ale na jakiej zasadzie ma byc liczony czas po ktorym mozna ponownie dodac posta? 60 sekund jak zaproponowal kolega wyzej? to klikne F5 po 65 sekundach. 120 sekund? to klikne F5 po 125 sekundach? 240 sekund? itd. To rozwiazanie moze byloby i dobre, ale na calkowicie inny problem. Na spamerow, trolli czy inne typu wynalazki, czyli zablokowanie mozliwosci wysylanie duzej ilosci postow przez tego samego uzytkownika w krotkim czasie. Ale bynajmniej nie jest to rozwiazanie na refresh o ktory sie w tym topicu rozchodzi.

# rozwiazanie z przechwytywaniem wyjatkow z bazy owszem dziala, ale tylko jesli zapisujemy tresc formularza do bazy. a co jesli ma byc zapisywany do pliku, wyslany mailem, czy cokolwiek innego ma sie z nim dziac?

# rozwiazanie z dodawaniem atrybutow UNIQUE do pol bazy zadziala jak wyzej - tylko w przypadku, gdy dane z formularza maja wyladowac w bazie.



Wiec jak to najlepiej zrobic i tak zeby dzialalo zawsze?

# jednym z rozwiazan jest to o czym zapewne wiekszosc z was wie. czyli przekierowanie w pliku do ktorego odwoluje sie akcja formularza.
jesli mamy formularz:
  1. <form action="wykonaj_akcje.php">
  2. ...
  3. </form>


to w pliku wykonaj_akcje.php zapisujemy:
  1. <?
  2. //jakies akcje
  3. header("Location: akcja_wykonana.php")
  4. ?>


# drugie rozwiazanie, ktore ja osobiscie najczesciej stosuje, jest to o czym pisal nospor.
w momencie generowania formularza generujemy pole typu "hidden" z jakims hashem/tokenem czy jak tam kto woli nazywac. ma to byc jakis unikalny ciag znakow/liczb:
  1. <input type="hidden" id="hash" name="hash" value="<?=generateHash();?>">
  2. <?php
  3. function generateHash()
  4. {
  5. return md5(time() * rand()); //samo time() nie wystarczy, gdyz jego wartosc zmienia sie co sekunde a to za malo
  6. }
  7. ?>


wartosc tego pola zapisujemy do sesji, do cookie, do pliku albo do bazy - jak komu w danej chwili wygodniej/jakie ma mozliwosci.
w przypadku zapisu da bazy tabela z postami bedzie miala dodatkowe pole "hash". po kliknieciu F5 (refresh) zostanie wyslany ten sam formularz, czyli dokladnie z tym samym hashem - nie bedzie on od nowa wygenerowany. teraz wystarczy sprawdzic czy dany hash mamy juz w sesji, w bazie, w cookie, w pliku czy gdziekolwiek indziej i problem z powtorzeniem zalatwiony
i tutaj juz nie chodzi o sprawdzenie czy to ten sam uzytkownik, to samo IP, ponownie ten sam tekst czy cokolwiek innego - sprawdzamy dokladnie to o co chodzi - czy jest proba ponownego wyslania tego samego formularza.
Go to the top of the page
+Quote Post

Posty w temacie
- skowron-line   odświeżanie strony, zapis   26.03.2006, 21:56:00
- - TomASS   Możesz albo zablokować możliwość dwóch postów tego...   26.03.2006, 22:24:54
- - mike_mech   Ponowny zapis do bazy po odświeżeniu strony   27.03.2006, 10:09:24
- - huntercs   w prosty sposób można to osiągnąć, mianowicie: np....   27.03.2006, 11:23:36
- - skowron-line   a jezeli chcem zrobic to przy zapisie do pliku .tx...   27.03.2006, 21:35:11
- - erix   to nie ma znaczenia, co robisz po submicie formula...   28.03.2006, 07:27:16
- - nospor   Cytat(huntercs @ 2006-03-27 12:23:36)w prosty...   28.03.2006, 07:34:02
- - skowron-line   to chyba najlepszym sposobem jest po nacisnieci su...   28.03.2006, 11:11:27
- - nospor   Ja to robię jeszcze inaczej. PRzy tworzeniu formu...   28.03.2006, 12:14:16
- - skowron-line   a do bazy danych to wymyslilem ze moge wyciagnac o...   28.03.2006, 20:52:50
- - huntercs   tylko po co mieszać do tego bazę? dodaktowe zapyta...   28.03.2006, 23:01:57
- - Kuziu   A nie prościej zrobić np. dodanie commenta po czym...   28.03.2006, 23:15:40
- - mike_mech   Cytat(huntercs @ 2006-03-28 23:01:57)tylko po...   29.03.2006, 08:56:34
- - nospor   CytatWystarczy nałożyć kluch UNIQUE.Ale nalozysz k...   29.03.2006, 08:59:38
- - mike_mech   Cytat(nospor @ 2006-03-29 08:59:38)a co jesli...   29.03.2006, 09:12:59
- - nospor   dalej sie z tobą nie zgadzam. Istnieją przecież ta...   29.03.2006, 09:18:12
- - mike_mech   Ładnie, bardzo ładnie. Ja to robię tak:[PHP] pobi...   29.03.2006, 09:30:15
- - nospor   A że ja upierdliwy jestem... A co w przypadku, gdy...   29.03.2006, 10:00:19
- - skowron-line   ja napisalem cos takiego i dziala [PHP] pobierz, p...   29.03.2006, 10:00:31
- - nospor   ale o ile dobrze wczytuje sie w ten kod, to ty zro...   29.03.2006, 10:20:24
- - skowron-line   To ma byc tak: wpisujesz jakis text i naciskasz su...   29.03.2006, 10:38:41
- - nospor   Cytatwpisujesz jakis text i naciskasz submit wtedy...   29.03.2006, 10:41:49
- - skowron-line   nospor zwracam honor przeanalizowalem ten skrypt i...   30.03.2006, 10:16:35
- - Krisu   Da sie zrobic jakos tak, zeby dodaj i zapisz bylo ...   31.03.2006, 19:55:20
- - tes   nospor, a mógłbyś napisać jak potem z tej sesji wy...   11.04.2006, 01:21:35
- - nospor   @tes ja go nie wyrzucam. Jak pisalem, generuję uni...   11.04.2006, 06:47:36
- - Pilsener   Porównać IP gościa i czas - moim zdaniem najlepszy...   19.04.2006, 08:31:30
- - free   Ja stosuje prosta metode, poprostu za pomocą JS lu...   16.11.2006, 13:44:16
- - Cypherq   O rany, zaczęliście całą religię do tego problemu ...   19.04.2007, 14:42:07
- - Sedziwoj   Może większego nie, ale jak ja szybko piszę i odpo...   19.04.2007, 15:41:41
- - l0co   Niepotrzebnie zakładałem nowy wątek - więc dopisuj...   6.09.2007, 12:58:17
- - WebCM   Jeżeli chcemy tylko ochronić skrypt prze...   30.12.2007, 14:52:26
- - nospor   źle. Ajax/js nie jest rozwiązaniem na p...   30.12.2007, 14:57:21
- - be2k   to moze i ja dorzuce swoje 3 grosze. # rozwiazan...   26.01.2008, 12:50:49
- - mroczek   Jeżeli chcemy zrobić to za pomocą sesji to sugeruj...   9.11.2008, 13:23:14
- - mlattari   hmm... najprościej to chyba przed przetwarzaniem i...   27.02.2009, 01:31:26
- - piotr94   u mnie problem znika wraz z samym tokenem - za każ...   12.11.2009, 16:39:52
- - Thorang Hoog   Hmm jak tak czytam wasze wypowiedzi to o mało nie ...   17.12.2009, 23:28:55
- - andycole   Temat trochę leciwy, ale jako że przyklejony to ch...   1.10.2010, 22:55:14
- - radziopoke   Odkopię trochę temat bo i ja zacząłem poszukiwać s...   7.02.2011, 17:13:44
- - AndyPSV   dorzuce jeszcze do wypowiedzi wszystkich - prosty ...   11.03.2011, 12:08:54
- - picios   Stare już, ale dodam od siebie: [PHP] pobierz, pla...   6.06.2011, 23:13:50
- - olszam   stary temat ale może coś od siebie raz dam [PHP] p...   11.10.2012, 15:52:08
- - mruz   Mam problem przy wysyłaniu takiego formularza z up...   16.03.2013, 20:40:22
- - CuteOne   [PHP] pobierz, plaintext $_SESSION['crf'] = md5...   16.03.2013, 21:01:43
- - mruz   Dzięki @CuteOne, pomogło.   16.03.2013, 21:23:27
- - Khartas   Mam podobny problem z powtarzaniem wpisów. Gdzie i...   31.03.2013, 23:15:17
- - gitbejbe   odgrzewam kotleta. co do @up. to po 17stej linijc...   20.06.2013, 10:14:36
- - Damonsson   Niesamowitą głupotę, to napisałeś, co najwyżej. Po...   20.06.2013, 10:24:22


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 Wersja Lo-Fi Aktualny czas: 23.06.2024 - 19:35