• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapamiętywanie pola select w formularzu

Object Storage Arubacloud
0 głosów
825 wizyt
pytanie zadane 8 września 2016 w PHP przez Adam Ostrogórski Obywatel (1,070 p.)

Witam,

mam formularz, w którym zamieściłem pola select. Mam też walidację. I próbuję dodać trzeci element, czyli zapamiętywanie pól poprawnie wypełnionych, w razie gdy użytkownik popełni gdzieś błąd. I nie wiem, czemu wyborów z select mi nie zapamiętuje. Wszystko inne działa. Czy ktoś wie, gdzie w poniższym kodzie jest jakiś błąd, bądź czegoś brakuje?


<select name="modelsamochodu" id="car-select" <?php echo (isset($_POST['modelsamochodu'])? 'selected="selected"':'') ?>>
    <option value="">Wybierz opcję</option>
    <option value="Opcja 1">Opcja 1</option>  
    <option value="Opcja 2">Opcja 2</option>	
    <option value="Opcja 3">Opcja 3</option>	
</select>

 

Ew. próbowałem w ten sposób, ale niestety też nie działa i nie zapamiętuje wyboru:

<?php 
     $options = [
          0 => 'Wybierz opcje',
           1 => 'Opcja 1',
            2 => 'Opcja 2',
            3 => 'Opcja 3'
       ];
                            
       $selected = 0;
?>

<select >
	<?php foreach($options as $value => $name): ?>

         <option value="<?php echo $value ?>"<?php echo ($value==$selected) ? 'selected="selected"' : '' ?>>
<?php echo $name ?>
            </option>

           <?php endforeach; ?>

</select>

 

Z góry dziękuję za pomoc.

1 odpowiedź

+1 głos
odpowiedź 8 września 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 8 września 2016 przez Adam Ostrogórski
 
Najlepsza
<select name="modelsamochodu" id="car-select" <?php echo (isset($_POST['modelsamochodu'])? 'selected="selected"':'') ?>>

W jaki sposób ten kod miałby zadziałać? Przeglądarka ma zgadnąć który element z listy został wybrany przez użytkownika?

Po prostu atrybut selected należy dodać do odpowiedniego option, nie do całego select.

komentarz 8 września 2016 przez Adam Ostrogórski Obywatel (1,070 p.)

Czyli powinno to wyglądać w ten sposób? :

<select name="modelsamochodu" id="car-select" >
                            <option value="">Wybierz model auta</option>
                            <option value="Opcja 1" <?php echo (isset($_POST['modelsamochodu'])? 'selected="selected"':'') ?>>Opcja 1</option>  
							<option value="Opcja 2" <?php echo (isset($_POST['modelsamochodu'])? 'selected="selected"':'') ?>>Opcja 2</option>	
							<option value="Opcja 3" <?php echo (isset($_POST['modelsamochodu'])? 'selected="selected"':'') ?>>Opcja 3</option>	
 </select>

 

Bo zapamiętuje ostatni wybór, czy coś pomyliłem?

komentarz 8 września 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)
Tak, lekko pomyliłeś, ponieważ nie sprawdzasz która opcja została wybrana.

$_POST['modelsamochodu'] istnieje zawsze gdy tylko formularz z tym selectem zostanie wysłany, więc warunek który postawiłeś zawsze jest prawdziwy, a co za tym idzie do każdej opcji zostanie dopisany atrybut selected (finalnie pewnie dlatego zawsze zaznacza ostatnią opcję).

Należy więc sprawdzić czy to właśnie taką wartość jak value danego option ma $_POST['modelsamochodu'] i tylko jeśli tak dopisywać selected.
komentarz 8 września 2016 przez Adam Ostrogórski Obywatel (1,070 p.)
Przepraszam, ale jestem początkujący w php, czy mógłbyś napisać jak taki warunek należałoby sprawdzić? Zamiast isset dać if?
komentarz 8 września 2016 przez Pietrak Pasjonat (18,850 p.)
To wyżej to skrócony zapis if.

Możesz napisac warunek isset($_POST['modelsamochodu']) && $_POST['modelsamochodu'] == "Opcja 1"
komentarz 8 września 2016 przez Arkadiusz Waluk Ekspert (287,950 p.)

@Adam wydaje mi się, że mylisz pojęcia. If to po prostu instrukcja warunkowa, w tej chwili też masz ją u siebie w kodzie (tyle że w formie skróconej) i bez ifa na pewno się nie obejdzie. A isset jest tylko funkcją, która sprawdza czy dana zmienna albo element tablicy istnieje i jeśli tak to zwraca true.

Mogłoby więc wyglądać to np. tak:

<option value="Opcja 1" <?php echo ($_POST['modelsamochodu'] === 'Opcja 1' ? 'selected="selected"' : '') ?>>Opcja 1</option>  

lub też tak:

<option value="Opcja 1" <?=$_POST['modelsamochodu'] === 'Opcja 1' ? 'selected="selected"' : ''?>>Opcja 1</option>  

albo tak:

<option value="Opcja 1"
<?php
if ($_POST['modelsamochodu'] === 'Opcja 1') {
    echo 'selected="selected"';
}
?>
>Opcja 1</option> 

Wszystkie zapisy oznaczają właściwie to samo i powinny działać. W tym przypadku zakładam, że zawsze istnieje $_POST['modelsamochodu'], jeśli wcześniej nie jest to sprawdzane to również należałoby to robić (a jeszcze lepiej byłoby odczytać przez filter_input i nie ma problemu ze sprawdzaniem).

I cóż, na koniec mogę jeszcze wspomnieć, że warto oddzielać kod HTML od PHP, np. przy użyciu systemu szablonów Twig - jest po prostu czytelniej i wygodniej, nie mieszamy logiki aplikacji i tego co widoczne. Jeśli jednak nie rozumiesz dobrze samych podstaw PHP jak ify to polecałbym najpierw ogólnie lepiej ogarnąć sam język na początek.

komentarz 8 września 2016 przez Adam Ostrogórski Obywatel (1,070 p.)
Bardzo dziękuję za pomoc. Wszystko działa i już zrozumiałem.

Podobne pytania

0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 16 kwietnia 2017 w PHP przez Marduczek Użytkownik (520 p.)
0 głosów
1 odpowiedź 431 wizyt
0 głosów
1 odpowiedź 684 wizyt
pytanie zadane 1 września 2017 w PHP przez ThePatrykOOO Dyskutant (8,400 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...