ďťż
Podstrony
|
telcocafeWitam po raz kolejny. Chciałbym uzyskać pomoc w kwestii zabezpieczenie danych w formularzu przed przeładowaniem i przyciskiem wstecz. Znalazłem na to 3 sposoby - cookie, sesje i nagłówek. Niestety, nie umiem tego połączyć z moim wielostopniowym formularzem... Pomoże ktoś mądry?if (isset($_POST['krok']) && $_POST['krok'] == "1") { // tu kontrola wypełnienia w js echo "<center><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST' onsubmit='return testuja(this);'>"; echo "<input type='hidden' name='krok' value='2'>\n"; echo "<input type='submit' name='dalej' value='Idź dalej'></form>"; } elseif (isset($_POST['krok']) && $_POST['krok'] == "2") { echo "<center><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST' onsubmit='return checkRadios(this);'>"; // tu kontrola wypełnienia w js echo "<input type='hidden' name='krok' value='3'>"; echo "<input type='submit' name='dalej' value='Idź dalej'></form>"; } elseif (isset($_POST['krok']) && $_POST['krok'] == "3") { echo "<center><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST' onsubmit='return testujb(this);'>"; // tu kontrola wypełnienia w js echo "<input type='hidden' name='krok' value='4'>\n"; echo "<input type='submit' name='dalej' value='Idź dalej'></form>"; } else { echo "<hr class='hr' /><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST'>"; echo "<input type='hidden' name='krok' value='1'>\n"; echo "<input type='submit' name='dalej' value='Idź dalej'></form>"; } A dlaczego chcesz to blokować? Tego nie zablokujesz bo to opcja przeglądarki, a nie strony - kodu po twojej stronie. Jak masz wielostopniowy formularz to musisz walidować po stronie serwera czy użytkownik znajduje się na poprawnym etapie formularza, a jak nie jest to przekierować na taki z odpowiednim komunikatem. Chodzi mi, żeby nie przetwarzać ponownie tego samego kodu. W tym formularzu, w jego krokach inkluduję pliki, gdzie obrabiam grafikę... no i przy opcji COFNIJ, można dodawać grafikę na grafikę w nieskończoność ;) A tego chcę uniknąć. Kiedyś trafiłem na trick, który powodował, że przycisk WSTECZ kierował do formularza, a nie do strony z informacją "Post został zapisany". Prawdopodobnie kod JS lub znacznik META. Czy ktoś pamięta? To prawdopodobnie nie jest skuteczne rozwiązanie. Firefox pyta, czy wysłać ponownie dane POST. Opera 9 nie. Najprościej zrobić takie cuś :) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> </head> <body onload="document.myform.reset();"> <form name="myform"> <input type="text"></input> </form> </body> </html> Użytkownik bajeczny edytował ten post 04 lipiec 2009, 22:39 Chodzi mi, żeby nie przetwarzać ponownie tego samego kodu. W tym formularzu, w jego krokach inkluduję pliki, gdzie obrabiam grafikę... no i przy opcji COFNIJ, można dodawać grafikę na grafikę w nieskończoność ;) A tego chcę uniknąć. To jak dodał grafikę to przy ponownej próbie wysłania grafiki wykrywasz ten fakt i nie obrabiasz nowej fotki tylko przekierowujesz dalej. Próby JSowe itd. wiele nie dadzą bo np. Opera dość skutecznie pozwala się cofać do skeszowanych całkowicie stron. No właśnie... U mnie user nie dodaje grafiki, wybiera tylko z zasobów. Skrypty łączą, lub nakładają grafiki na siebie. To powinieneś zapisywać na jakim etapie już był - i jeżeli będzie na nim ponownie - przekierować przy próbie np. ponownego wysłania formularza. To nie jest jakaś technologia. Kwestia dobrej walidacji danych z wykorzystaniem np. bazy danych. Tu problem, skrypt ma być bez bazy danych, ew. coś na plikach. Kombinowałem dać w switch tak: <?php case 4:{ if (!isset($_SESSION['krok']) or empty($_SESSION['krok'])) $_SESSION['krok'] = 4; else $_SESSION['krok']++; echo "<center><form name='generator' action='herb1.php?krok=5' method='POST'>"; if ($_SESSION['krok'] > $_GET['krok']) { // ktos wcisnal wstecz include('include/krok3.php'); } else { // jest poprawnie include('include/krok4.php'); } echo "<input type='hidden' name='krok' value='5'>\n"; echo "<input type='submit' name='dalej' value='Idź dalej'></form>"; break;} ?> To już zaczyna się rzeźbienie ;) twój problem, choć w PHP5 masz przecież SQLite ;) Nawet na bazie plików można zrobić zapis etapu, np. dla danego IP w najprostszym przypadku. Najgorsze jest to, że przekopałem Google wzdłuż i wszerz, a nie znalazłem jakiegoś przykładu, który by był na tyle jasny, żebym mógł zakumać. po przejściu na kolejny etap zapisujesz numer etapu. Przy odbiorze POSTa sprawdzasz czy pochodzi on z poprawnego - obecnego etapu, a nie wcześniejszego. Porównywałem to w sesji, ale nie działa: if (isset($dalej) and $_POST["id"]==$_SESSION["id"]) { echo "<p>Nie działa F5<p>"; } if (isset($dalej) and $_POST["id"]<>$_SESSION["id"]) { $_SESSION["id"] = $_POST["id"]; echo $dalej; } Próbowałem porównywać w switch: if (!isset($_SESSION['krok']) or empty($_SESSION['krok'])) $_SESSION['krok'] = 1; else $_SESSION['krok']++; Chyba zabiorę się za cookie jeszcze, ale zaczyna mi brakować nerwów... Obchodzisz rozwiązanie nie przechowując danych po stronie serwera (baza danych, w ostateczności pliki), przez co musisz rzeźbić jakieś kosmiczne haki ;) I łatwiej nie będzie. Niestety, nie kumam tematu. Jeżeli ktoś mi nie pomoże, stoję w temacie... Użytkownik Kshyhoo edytował ten post 05 lipiec 2009, 17:31 |
|||
Sitedesign by AltusUmbrae. |