![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 21.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Nie mogę sobie poradzić z blokowanie wysyłania podwójnego formularza i odświeżania strony. Mam nadzieję, że uzyskam od Was jakie wskazówki, jak poradzić sobie z tym problemem. Mam formularz w pliku form.php. Jego wysłanie zostaje przetworzone w tym samym pliku i gdy zostaną wykonane odpowiednio zapytania do bazy (załóżmy, że walidacja przeszła ok) pojawi się komunikat, ze zostało coś dodane oraz będzie możliwość, ponownie przez ten formularz (form.php), dodania kolejne rzeczy. Nie jest tutaj stosowane żadne przekierowanie. Nie mam pojęcia, jak zablokować to podwójne wysyłanie formularza. Trochę kombinowałem z sesjami, jednak bez rezultatów. Dodam jeszcze, że dodane w bazie informacje w bazie przez ten formularz mogą się powtarzać, więc rozwiązanie sprawdzenie, czy w bazie coś już takiego istnieje odpada. Będę wdzięczny za każdą pomocą. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 933 Pomógł: 460 Dołączył: 2.04.2010 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Przekierowanie do strony np. success.php gdzie tylko pisze, że poprawnie dodano czy coś tam i z tej strony kolejne przekierowanie, z powrotem do formularza.
-------------------- Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Z pomocą przyjdzie Ci jeden z podstawowych wzorców projektowych w programowaniu aplikacji webowych, a mianowicie PRG czyli post/redirect/get. Możesz poczytać o tym trochę na wikipedii: Post/Redirect/Get (niestety tylko po angielsku), albo pogooglować (taki mini artykulik znalazłem: Wielki Post i mały Get.
Generalnie chodzi o to, żeby najpierw sprawdzić, czy jakieś dane są przesyłane POSTem a dopiero potem zadecydować co robić dalej. Dla przykładu, w jednym skrypcie:
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 21.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję Wam za odpowiedzi. Będę kombinować dalej i zobaczymy, co z tego wyjdzie. W razie jakiś pytań, pewnie się tutaj odezwę.
![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 39 Pomógł: 1 Dołączył: 3.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tak, wiem że kopię...
![]() Wpadłem właśnie na pomysł, bardzo prosty pomysł. Podczas wysyłania formularza, wysyłamy także dodatkowy ukryty input, który przechowuje wartość wygenerowaną przez funkcję rand() - czyli krótko mówiąc jakąś liczbę z przedziału dziesiątek tysięcy. Szansa więc na powtórzenie się tej samej wynosi 1 do kilkudziesięciu tysięcy. Pobraną wartość rand() z formularza zapisujemy w sesji i przed wykonaniem np. zapytania do bazy (bo to jest z reguły największym problemem) sprawdzamy czy nowa sesja jest identyczna z tą, która zapisaliśmy wcześniej. Jeśli tak, oznacza to że użytkownik odświeżył stronę, a my zablokujemy mu możliwość ponownego wykonania kodu (w tym wypadku zapytania do bazy).
Wpadłem na to jak widać o 1:51. Pomysł może być kulawy, jednak na tę chwilę wydaje mi się, że wszystko działa jak należy. Jeśli ktoś bardziej zaawansowany na to spojrzy, fajnie gdyby stwierdził czy to rzeczywiście jest takim świetnym rozwiązaniem. @EDIT Przeglądając dalej google z ciekawości, czy ten sposób jest rzeczywiście wystarczający dowiedziałem się że to co przedstawiłem potocznie nazywa się tokenem - a to wcale nic nowego. ![]() Ten post edytował Krychu1 16.08.2013, 01:16:11 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 5.06.2025 - 20:27 |