Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formularze - zapamiętywanie danych
Forum PHP.pl > Forum > PHP
slawo
Witam,
mam pewien formularz. Gdy wszystko zostanie uzupełnione dodaje się rekord do bazy. Jednak gdy nie wypełnimy jednej rzeczy to zwraca komunikat, że coś nie zostało wypełnione i pojawia się button 'popraw' (wstecz). Po jego kliknięciu chciałbym żeby zostawały wpisane wcześniej dane żeby nie wpisywać wszystkiego od nowa.
blooregard
Powinieneś to rozwiązać w ten sposób, by skrypt nie przechodził dalej, ale do skutku monitował o poprawne wypełnienie całego forma.

Drugie rozwiązanie to zapisanie sobie wartości pól w sesji i wtedy możesz je przywrócić w każdej chwili.
Bangeusz
Cytat(blooregard @ 2.04.2010, 20:49:07 ) *
Powinieneś to rozwiązać w ten sposób, by skrypt nie przechodził dalej, ale do skutku monitował o poprawne wypełnienie całego forma.

Czyli dla jasności kolega mówi o funkcji exit;. Chodzi o to, że jak masz sprawdzanie, czy wszelkie wymagane pola zostały wpisane, to po tym dajesz exit;, by Ci nie dodawał rekordu z lukami, których użytkownik nie wypełnił.
P4vl0
Zapewne przekazujesz te dane jakąś metodą, więc możesz jako wartość pól wstawić te dane, np.
Kod
<input class="text" type="text" name="imie" value="<?php echo $_POST['imie'];?>" />
phpion
Cytat(Bangeusz @ 14.04.2010, 22:43:20 ) *
Czyli dla jasności kolega mówi o funkcji exit;. Chodzi o to, że jak masz sprawdzanie, czy wszelkie wymagane pola zostały wpisane, to po tym dajesz exit;, by Ci nie dodawał rekordu z lukami, których użytkownik nie wypełnił.

Mylisz się. Chodzi o taki algorytm:
Kod
if (wypelniono_formularz && wypelniono_go_poprawnie) {
    zapisz_dane_do_bazy();
    
    przekieruj_na_strone_z_potwierdzeniem();
}
else {
    wyswietl_formularz_ze_wstawionymi_danymi(); // jeśli nie wypełnino formularza wstaw dane domyślne
}

Stosowanie exit (które sugerujesz) jest nieeleganckie i typowo amatorskie.
mortus
Cytat(Bangeusz @ 14.04.2010, 22:43:20 ) *
Czyli dla jasności kolega mówi o funkcji exit;. Chodzi o to, że jak masz sprawdzanie, czy wszelkie wymagane pola zostały wpisane, to po tym dajesz exit;, by Ci nie dodawał rekordu z lukami, których użytkownik nie wypełnił.
@Bangeusz Po pierwsze exit() to nie funkcja tylko element składni języka. Po drugie exit() zatrzymuje wykonywanie skryptu, zatem wszystko co ma "nastąpić" po exit() nie nastąpi.
Zamiast exit() możemy użyć zmiennej typu boolean, która będzie przyjmować wartość false, jeśli tylko któreś z pól formularza będzie puste. Przykład
  1. <?php
  2. if(!empty($_POST)) {
  3. if(empty($_POST['firstname'])) {
  4. $invalidForm = true;
  5. $error['EMPTY_FIRSTNAME'] = true;
  6. }
  7. if(empty($_POST['lastname'])) {
  8. $invalidForm = true;
  9. $error['EMPTY_LASTNAME'] = true;
  10. }
  11. if(!isset($invalidForm)) {
  12. // wszystko jest w porządku i możemy
  13. // zapisać dane do bazy danych
  14. // później możemy wykonać przekierowanie
  15. echo 'It\'s OK!';
  16. }
  17. }
  18. ?>
  19. <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
  20. <input type="hidden" name="action" value="save" />
  21. <dl>
  22. <dt>First name:</dt>
  23. <dd>
  24. <input type="text" name="firstname" value="<?php echo isset($_POST['firstname']) ? $_POST['firstname'] : ''; ?>" /><?php if(isset($error['EMPTY_FIRSTNAME'])) echo ' Uzupełnij pole'; ?>
  25. </dd>
  26. <dt>Last name:</dt>
  27. <dd>
  28. <input type="text" name="lastname" value="<?php echo isset($_POST['lastname']) ? $_POST['lastname'] : ''; ?>" /><?php if(isset($error['EMPTY_FIRSTNAME'])) echo ' Uzupełnij pole'; ?>
  29. </dd>
  30. <dt></dt>
  31. <dd><input type="submit" value="Zapisz" /></dd>
  32. </dl>
  33. </form>

EDIT:
Oczywiście sposobów rozwiązania takiego typu problemów jest więcej.
futura
Stwórz sobie tablice np.
Kod
$errors = array();
. Po wysłaniu formularza metodą POST sprawdzasz warunki np:

Kod
if($_POST['imie'] == '') {$errors = "Nie pdałeś imienia!";} elseif($_POST['nazwisko'] == '') {$errors = "Nie pdałeś nazwiska!";}


I tak dalej sprawdzasz. Jak już skończysz sprawdzasz czy tablica zawiera jakieś dane np.

Kod
if(sizeof($errors) > 0)
{
   foreach ($errors as $blad)
    {
         echo "- ".$blad."<br />";
    }
}
else
{INPUT do bazy}

Jeżeli chodzi o zapamiętanie danych z formularza to najlepiej zrobić tak:

Kod
                  <td><label>Nazwisko:</label></td>
                  <td><input type="text" name="nazwisko" value="<? echo $_POST['nazwisko'];?>" /></td>
thek
A jeszcze lepiej utworzyć $errors jako tablicę i wrzucać do niej wszystkie błędy, które potem wyświetlamy. Jeśli nie ma ani jednego wpisu -> count($errors) == 0; <- to robimy insert/update do bazy. Jesli coś jest to w bazie nic nie robimy, ale wyświetlamy formularz z komunikatami błedów w tejże tablicy. Sam nieraz na forum to podawałem ale jak widać nigdy nikt szukajki nie żywa, a sam temat jest maglowany średnio raz na tydzień, ale nikomu nie chce się szukać jak widać. Bo po co, skoro prościej napisać nowy temat?
futura
Cytat
A jeszcze lepiej utworzyć $errors jako tablicę i wrzucać do niej wszystkie błędy, które potem wyświetlamy. Jeśli nie ma ani jednego wpisu -> count($errors) == 0; <- to robimy insert/update do bazy. Jesli coś jest to w bazie nic nie robimy, ale wyświetlamy formularz z komunikatami błedów w tejże tablicy.


Takie przykładowe rozwiązanie podałem wyżej smile.gif
Pilsener
Czyli tak powstał tutorial dla początkujących:
- nie używajmy die ani exit, lecz obsługi błędów w najprostszej postaci sprawdzając przed każdym etapem czy tablica błędów jest pusta, radzę też zainteresować się modelem MVC i wyjątkami, popatrzeć jak radzą sobie z obsługą błędów i formularzy popularne frameworki
- wszystkie żądania kierujemy do jednego pliku (najlepiej /index.php) a potrzebne do wygenerowania treści fragmenty kodu includujemy, czyli dostarczamy odpowiedni kod do danych/parametrów (z formularza, adresu, cfg), a nie wysyłamy danych do pliku z kodem smile.gif
- ograniczajmy przekierowania, bo obniżają wydajność, wykryjemy bez problemu czy user kliknął "wstecz" czy nie, pamiętajmy, że odpowiednio ustawiając nagłówki http możemy zmusić przeglądarkę by zapamiętała wypełnienie pól formularza (dobre dla leniwych i początkujących)

I najważniejsze - twórzmy aplikację logicznie :
1. Odbieramy parametry z POST, GET, cfg
2. Przygotowujemy odpowiednie zmienne
3. Składamy z nich odpowiednią stronę łącząc je z kodem HTML
4. Wysyłamy stronę do przeglądarki

Bo potem wstyd, żeby po 15 latach rozwoju PHP ludzie echują i exitują jak najęci, co wymodzi to zaraz drukuje na ekranie, potem weź to przerabiaj :/
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.