Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Formularz pamięta stan pól input, po wciśnięciu przycisku submit chciałbym żeby nie zapamiętywał
Forum PHP.pl > Forum > Przedszkole
Rafalll1984
Jestem nowy na forum i dopiero raczkuje w php. Mam taki problem jak w temacie, męczę się z tym już od paru dni i nie wiem jak to rozgryźć sciana.gif

Przejdę może do konkretów, do zapisywania danych z formularza wykorzystałem skrypt z artkułu "Formularz i stronicowanie - pamiętanie stanu" nospora LINK

po przekształceniu pod siebie mam taki kod:


  1. <?php
  2.  
  3.  
  4. if (!empty($_POST['wyslij']) && $jakas_zmienna==1)
  5. {
  6.  
  7. $_SESSION['formularz'] = array(
  8. 'imieinazwisko' => $_POST['imieinazwisko'],
  9. 'email' => $_POST['email'],
  10. 'zgoda' => $_POST['zgoda'],
  11. 'wiadomosc' => $_POST['wiadomosc']);
  12.  
  13. $dane_z_form = array(
  14. 'imieinazwisko' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['imieinazwisko'],
  15. 'email' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['email'],
  16. 'zgoda' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['zgoda'],
  17. 'wiadomosc' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['wiadomosc'], );
  18.  
  19. }
  20.  
  21. $jakas_zmienna=1;
  22.  
  23. ?>
  24.  


...Formularz jest walidowany, a po przejściu walidacji prawidłowo dalsza część skryptu wysyła mail z serwera

  1.  
  2. mail($adresat, $temat, $dane, $odkogo );
  3. echo "<strong>Wiadomość została wysłana!</strong>";
  4.  
  5. $jakas_zmienna=0; // i tu właśnie chciałbym żeby ta zmienna przyjęła wartość 0 i odniosła się do początku pliku, gdzie mamy if (!empty($_POST['wyslij']) && $jakas_zmienna==1). Żeby nie został spełniony warunek


i tu właśnie chciałbym żeby ta zmienna przyjęła wartość 0 i odniosła się do początku pliku, gdzie mamy if (!empty($_POST['wyslij']) && $jakas_zmienna==1). Żeby nie został spełniony warunek!

Poproszę o jakieś sugestie jak to rozwiązać, z czego skorzystać i na czym się skupić. Może ktoś ma zupełnie jakiś inny pomysł na rozwiązanie problemu. Będę wdzięczny za jakąkolwiek pomoc.
nospor
nie rozumiem o co ci chodzi, ale odniose sie do kodu co tu napisales.

ten kod:
  1. $dane_z_form = array(
  2. 'imieinazwisko' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['imieinazwisko'],
  3. 'email' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['email'],
  4. 'zgoda' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['zgoda'],
  5. 'wiadomosc' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['wiadomosc'], );
powinien byc poza warunkiem a u ciebie jest w. Naprawde tak to u Ciebie ma być? Bo po kodzie co tu pokazales to jest to bez sensu
thek
Przecież nie możesz się w takiej sytuacji cofnąć do czegoś co już zostało zrobione. Jeśli już tak bardzo chcesz się pozbyć tych wartości po zrobieniu POST to wyczyść sobie zmienną sesyjną lub nie zapisuj do sesji wartości z POST zależnie od tego jak u Ciebie to wygląda. Bo to właśnie SESSION ma za zadanie trzymać wartości pół formularza w pamięci.
Rafalll1984
Faktycznie jak patrze teraz na ten artykuł, zdaje się, że to twój nospor. To widzę, że popełniłem błąd i faktycznie kod miał być po za warunkiem. Wrzuciłem go do warunku przez pomyłkę ale spełniał swoje zadanie więc umkło mi to! A co do kodu który pokazałeś to nie wiem czy sam go do końca rozumie. Tablica $_SESSION['formularz'] zapisywana jest do zmiennej $dane_z_form która reprezentuje tablice.

A co do samego tematu. To problem przedstawia taką sytuacje:

osoba wchodzi na stronę z formularzem, wypełnia go:

1) Jeżeli wypełniła błędnie pola(walidacja formularza) to dzięki temu skryptowi

  1.  
  2. <?php
  3.  
  4.  
  5. if (!empty($_POST['wyslij']) && $jakas_zmienna==1)
  6. {
  7.  
  8. $_SESSION['formularz'] = array(
  9. 'imieinazwisko' => $_POST['imieinazwisko'],
  10. 'email' => $_POST['email'],
  11. 'zgoda' => $_POST['zgoda'],
  12. 'wiadomosc' => $_POST['wiadomosc']);
  13.  
  14. $dane_z_form = array(
  15. 'imieinazwisko' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['imieinazwisko'],
  16. 'email' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['email'],
  17. 'zgoda' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['zgoda'],
  18. 'wiadomosc' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['wiadomosc'], );
  19.  
  20. }
  21.  
  22. $jakas_zmienna=1;
  23.  
  24. ?>
  25.  


nie musi wypełniać wszystkiego od nowa, stan pól jest zapamiętany

2)

Po wypełnieniu wszystkiego poprawnie (walidacja formularza) zostaje wysłany formularz ( mail z serwera)
i w tym miejscu chciałbym żeby dane nie były już zapamiętywane

zaznaczę, że formularz ma opcje w actio="<?=$PHP_SELF; ?>" mam nadzieje, że to bardziej uzmysłowi problem
nospor
po prostu po poprawnym wypelnieniu wszystkiego i wysłaniu maila zrob:
unset($_SESSION['formularz']);
Rafalll1984
Cytat(thek @ 29.10.2009, 11:52:42 ) *
Przecież nie możesz się w takiej sytuacji cofnąć do czegoś co już zostało zrobione. Jeśli już tak bardzo chcesz się pozbyć tych wartości po zrobieniu POST to wyczyść sobie zmienną sesyjną lub nie zapisuj do sesji wartości z POST zależnie od tego jak u Ciebie to wygląda. Bo to właśnie SESSION ma za zadanie trzymać wartości pół formularza w pamięci.



thek czyli mam wyczyścić w moim przypadku zmienna $dane_z_form, tak, dobrze rozumie to?? Próbowałem jakiego czyszczenia tablicy ale ze słabym skutkiem

nospor
@Rafalll1984 napisalem ci przeciez co masz zrobic
thek
Rafalll1984 zrób cokolwiek by zmienna sesyjna nie zawierała nic lub została usunięta. Możesz to zrobić poprzez nadpisanie pól formularza wartościami domyślnymi, usunięcie zmiennej sesyjnej (co proponuje nospor z użyciem unset) lub całkowicie pomiń "zabawę" ze zmienną sesyjną w pliku i zamiast przepisywać wszystko z POST do SESSION a potem z jeszcze do $dane_z_form działaj tylko na zmiennej POST. Ów skrypt, którego autorem jest nospor, jest tak zaprojektowany by pamiętał dane po naciśnięciu submit. Jeśli chcesz ten efekt usunąć świadomie to większość rzeczy jest tam zbędna i możesz się do najprostszego forma w zasadzie cofnąć (oczywiście zostawiając walidację) i nospor oraz inni Ci sami to przyznają smile.gif Bo najprostszy form bez czegokolwiek ma takie domyślne zachowanie - by nie pamiętać.
Rafalll1984
Widzę Nospor ale napisałeś mi ostatnią wiadomość jak ja pisałem pytanie do Thek'a. I nie widziałem twoje odp.

Więc tak napisałem

  1.  
  2. mail($adresat, $temat, $dane, $odkogo );
  3.  
  4. unset ($dane_z_form);
  5. unset($_SESSION['formularz']);
  6. echo "<strong>Wiadomość została wysłana!</strong>";
  7.  
  8.  


Ale niestety nie przyniosło to oczekiwanych rezultatów

Nie wiem czy dobrze myślę ale może i unset($_SESSION['formularz']); zniszczy ta sessje

ale po wysłaniu formularza następuje przeładowanie strony

a pierwszy kod jaki jest to

  1.  
  2. <?php
  3.  
  4.  
  5. if (!empty($_POST['wyslij']) && $jakas_zmienna==1)
  6. {
  7.  
  8. $_SESSION['formularz'] = array(
  9. 'imieinazwisko' => $_POST['imieinazwisko'],
  10. 'email' => $_POST['email'],
  11. 'zgoda' => $_POST['zgoda'],
  12. 'wiadomosc' => $_POST['wiadomosc']);
  13.  
  14. $dane_z_form = array(
  15. 'imieinazwisko' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['imieinazwisko'],
  16. 'email' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['email'],
  17. 'zgoda' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['zgoda'],
  18. 'wiadomosc' => !isset($_SESSION['formularz']) ? null : $_SESSION['formularz']['wiadomosc'], );
  19.  
  20. }
  21.  
  22. $jakas_zmienna=1;
  23.  
  24. ?>
  25.  


więc ta sessja nie zostanie utworzona od nowa questionmark.gifsnitch.gif

Sorry chłopaki, że tak Was męczę i rozumie co piszecie. Do Thek'a zastosowałem ten skrypt żeby osoba która wypełni błędnie formularz nie musiała wszystkiego od nowa wpisywać. A po naciśnięciu przycisku submit wyczyściły jej się dane z formularza żeby nie myliła tego z błędnym wypełnieniem
thek
Nie widziałem tego w wymienionym kodzie z linku, ale powinieneś to rozwiązać tak, że w momencie gdy formularz zostaje przetworzony bez błędów niszczysz sesję i tylko wtedy. Dzięki temu jeśli nastąpił błąd, to będzie ona istnieć. Tylko prawidłowe przetworzenie danych sprawi, że ulegną one zniszczeniu. Dlatego nospor dobrze Ci radzi, tyle że to Ty musisz już wiedzieć gdzie w Twoim przerobionym kodzie możesz sobie na unset pozwolić. A jak już mówiłem... Robisz to dopiero po prawidłowym przebiegu całej walidacji, wysłaniu do bazy czy co tam jeszcze chcesz zrobić smile.gif

EDIT: Poza tym zwróć uwagę, że te dane przechowuje u Ciebie także zmienna $dane_z_form. Zobacz która z nich jest wpisywana jako value formularza w miejscu CO_TUTAJ w kodzie:
  1. <input type="text" value="CO_TUTAJ" />

I tę zmienna zniszcz poprzez unset po wysłaniu maila. Wtedy nie powinno nic wrzucić do pól.
Rafalll1984
Widzę Thek, że rozumiemy się smile.gif

Cytat(thek @ 29.10.2009, 13:21:31 ) *
Nie widziałem tego w wymienionym kodzie z linku, ale powinieneś to rozwiązać tak, że w momencie gdy formularz zostaje przetworzony bez błędów niszczysz sesję i tylko wtedy. Dzięki temu jeśli nastąpił błąd, to będzie ona istnieć. Tylko prawidłowe przetworzenie danych sprawi, że ulegną one zniszczeniu. Dlatego nospor dobrze Ci radzi, tyle że to Ty musisz już wiedzieć gdzie w Twoim przerobionym kodzie możesz sobie na unset pozwolić. A jak już mówiłem... Robisz to dopiero po prawidłowym przebiegu całej walidacji, wysłaniu do bazy czy co tam jeszcze chcesz zrobić smile.gif


No i ja dokładnie idę tym "tropem", od początku szedłem smile.gif

u mnie właśnie po przejściu prawidłowo wszystkich warunków (Walidacja) następuje, wysłanie maila ( z serwera). Więc myślę, że to jest ten moment o który nam chodzi. A przedstawia się on w chodzie tak

  1.  
  2. mail($adresat, $temat, $dane, $odkogo );
  3.  
  4. unset($_SESSION['formularz']);
  5. unset ($dane_z_form);
  6. echo "<strong>Wiadomość została wysłana!</strong>";
  7.  


No i może to i działa ale po wysłaniu wiadomości strona przeładowywuje się. Ja to tak rozumie, nie wiem czy słusznie. Zaznaczam, że formularz posiada <form id="kontakt" method="post" action="<?=$PHP_SELF; ?>">

a pierwsze linijki kodu to

  1. <?php
  2.  
  3.  
  4. if (!empty($_POST['wyslij']) && $jakas_zmienna==1)
  5. {
  6.  
  7. $_SESSION['formularz'] = array(
  8. 'imieinazwisko' => $_POST['imieinazwisko'],
  9. 'email' => $_POST['email'],
  10. 'zgoda' => $_POST['zgoda'],
  11. 'wiadomosc' => $_POST['wiadomosc'],
  12. ...


i nie powstaje w tym czasie na nowo $_SESSION['formularz'] questionmark.gifsnitch.gif


A co do tego co pytałeś to, według twoich zaleceń próbowałem na dwa sposoby:
z pominięciem zmiennej $dane_z_form

<input type="text" id="imie" name="imieinazwisko" size="20" maxlength="30" value="<?php echo $_SESSION['formularz']['imieinazwisko']; ?>"/>

i nią

<input type="text" id="imie" name="imieinazwisko" size="20" maxlength="30" value="<?php echo $dane_z_form['imieinazwisko'];?>"/>


Chciałem jeszcze zaznaczy, nie wiem czy to coś pomoże ale mój formularz ma schemat
  1. <?php
  2.  
  3. Skrypt nospora po przerobieniu
  4.  
  5. ?>
  6.  
  7. xhtml (formularz) w tym <form id="kontakt" method="post" action="<?=$PHP_SELF; ?>">
  8.  
  9. <?php
  10.  
  11. Skrypty walidujące
  12.  
  13. a po przejściu prawidłowo wszystkich warunków
  14.  
  15. mail();
  16.  
  17. unset($_SESSION['formularz']);
  18. unset ($dane_z_form);
  19. echo "<strong>Wiadomość została wysłana!</strong>";
  20.  
  21.  
  22. ?>

ewentualnie Thek mógłbym Ci wysłać na pw linka do mojego formularza testowego winksmiley.jpg
thek
PHP_SELF nie jest potrzebne smile.gif Zapis action="" powoduje odwołanie się pliku do samego siebie. W momencie gdy robisz unset, to wszystkie dane powinny zostać usunięte. Zauważ, że całość skryptu wykonuje się na serwerze i dopiero po jego przetworzeniu idzie plik html do klienta. Jeśli więc struktura jest taka jaką podałeś, to po przejściu walidacji wysyła maila niszczy zmienne wypisuje komunikat o powodzeniu i dopiero wtedy wypełnia formularz, a właściwie wtedy próbuje go wypełnić, bo w tym momencie sesja i $dane_z_forma powinny już być puste. Potem jest wysyłka dopiero do klienta kodu. Z poziomu logiki ten kod nie ma prawa się zachowywać inaczej. Mogłeś najwyżej gdzieś się porypać w nawiasach, ale wtedy byś miał problemy z jego wyświetlaniem jako czystego. Myślę, że najlepiej jeśli byś na PW mi lub tutaj wszystkim dał pełny kod tego pliku to może byśmy jakiś błąd znaleźli wszyscy. Bo w sytuacji gdy się przerabia czyjś kod, często można szczegółów nie zauważyć i utknąć na malutkim drobiazgu. Widząc cały kod formularza (nie tylko jego wynikowy html ) na bank znajdziemy przyczynę.
Rafalll1984
Thek zostawiłem Ci wiadomość na PW smile.gif
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.