• 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

VPS Starter Arubacloud
0 głosów
955 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 (288,770 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 (288,770 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 (288,770 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ź 213 wizyt
pytanie zadane 16 kwietnia 2017 w PHP przez Marduczek Użytkownik (520 p.)
0 głosów
1 odpowiedź 461 wizyt
0 głosów
1 odpowiedź 816 wizyt
pytanie zadane 1 września 2017 w PHP przez ThePatrykOOO Dyskutant (8,400 p.)

92,950 zapytań

141,909 odpowiedzi

321,133 komentarzy

62,284 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...