PHP Kleines Prob mit Formular <SELECT>

Stonebroke

klammUrgestein
10 Juni 2006
2.554
63
Ich würde gerne wie im folgende Code bei einer Fehleingabe in einem Formular die bereits getätigten Eingaben festhalten.

Im Feld "Email-Adresse" bleibt der Wert durch value='$email' erhalten.

Code:
echo "Email-Adresse: <input type='text' name='email' value='$email'>";

Im Feld "Auswahl" mit <select> habe ich noch keine Lösung mit für $auswahl. Bei einer Fehleingabe des Users springt die Auswahl immer zu der ersten Option (value='auswahl1').

Wie müsste ich folgenden Code ändern, damit die bereits getroffene Auswahl des Users erhalten bleibt? Beziehungsweise, wo käm $auswahl zur Geltung?

Code:
echo "Auswahl: <select class='form' name='auswahl'><option value='auswahl1'>Text für Auswahl 1</option><option value='auswahl2'>Text für Auswahl 2</option><option> .... usw. .... </option></select>";

Vielen Dank vorab für jede Hilfe! ;)
 
PHP:
selected="selected"
ist das Schlüsselwort. Du prüfst welcher Wert in deiner Variable steht und wenn er identisch ist zum Value des Selects setzt du den selected Befehl.
 
1. $_GET["email"] bzw. $_POST["email"] oder hast du das in $email gespeichert?

2. das Selected muß bei der jeweiligen option stehen.

Code:
<option value="hallo" selected="selected">
 
Ja, genau.

Ich sende Auswahl "CurrySchnitzel" ab und habe woanders einen Fehler. Dann ist CurrySchnitzel meine Auswahl, die in $_POST['select_name'] steht (als Zahl whsl).

Also genau die Abfrage, die du suchst ;)
 
So würde ich ja aussuchen, was schon vor-selectiert ist!

Genau, du selectierst das, was übergeben wurde.

<option value="hallo" <? if($auswahl=="hallo"){?>selected="selected"<?}?>>
<option value="hallo2" <? if($auswahl=="hallo2"){?>selected="selected"<?}?>>
<option value="hallo3" <? if($auswahl=="hallo3"){?>selected="selected"<?}?>>

etwas unschön, das kann man schöner machen...
 
Grad nicht getestet, geht aber nicht auch folgendes?

HTML:
<?php $auswahl = 3; ?>

<select name="auswahl" value="<?php echo $auswahl; ?>">
   <option value="0">A</option>
   <option value="1">B</option>
   <option value="2">C</option>
   <option value="3">D</option>
   <option value="4">E</option>
</select>

Edit...
Hm, geht so leider nicht.
Aber wenn mans mit JS macht, dann schon :D
HTML:
<script>document.getElementsByName('auswahl')[0].value = 2;</script>
 
Zuletzt bearbeitet:
ja, die IF-Lösung kam mir auch.

Nur mit weniger <? und ?> - also eine if die bei zutreffen ( $auswahl <> "" ) eine OPTION vor den anderen anstellt. So ist zwar eine Auswahl doppelt da, also:

Auswahl1
Auswahl1
Auswahl2

oder (möglich, wenn sich der User schon für Auswahl2 entschieden hat:

Auswahl2
Auswahl1
Auswahl2

Aber gut - vielen Dank soweit.
Hatte gedacht, dass es vielleicht ne einfachere Möglichkeit gibt.
 
Grad nicht getestet, geht aber nicht auch folgendes?

Nope, select hat kein Attribut value.

ja, die IF-Lösung kam mir auch.

Nur mit weniger <? und ?> - also eine if die bei zutreffen ( $auswahl <> "" ) eine OPTION vor den anderen anstellt. So ist zwar eine Auswahl doppelt da, also: [...]

Aber gut - vielen Dank soweit.
Hatte gedacht, dass es vielleicht ne einfachere Möglichkeit gibt.

Warum so kompliziert, ein passendes foreach hat vielleicht vier Zeilen:

PHP:
foreach ($choice as $choices) {
   echo sprintf('<option value="%s"',$choice);
   if strcmp($choice, $auswahl) echo ' selected="selected"';
   echo sprintf('>%s</option>',$choice);
}

... wobei choices jetzt eben ein Array ist mit den ganzen Auswahlmöglichkeiten. Davor und danach natürlich noch das <select> ausgeben, ist denke ich klar, wie ich es meine....


*edit* den ganzen strcmp-Quatsch kann man sich dann natürlich auch sparen und gleich den Index in das choices array als value benutzen, ist irgendwie auch schöner so...
 
ja, die IF-Lösung kam mir auch.

Nur mit weniger <? und ?> - also eine if die bei zutreffen ( $auswahl <> "" ) eine OPTION vor den anderen anstellt. So ist zwar eine Auswahl doppelt da, also:

Auswahl1
Auswahl1
Auswahl2

oder (möglich, wenn sich der User schon für Auswahl2 entschieden hat:

Auswahl2
Auswahl1
Auswahl2

Aber gut - vielen Dank soweit.
Hatte gedacht, dass es vielleicht ne einfachere Möglichkeit gibt.

Naja, man kann das auch alles php-seitig machen oder sinnvollerweise mit einer Template-Engine. Bsp für PHP:

PHP:
$auswahl = 1;
$arr = array(0 => "A", 1 => "B", 2 => "C");

foreach ($arr as $k => $v)
{
    if ($k === $auswahl)
    { 
       $neu[0] = array($k => $v);
    }

    else
    {
       $neu_2[] = array($k => $v);
    }
}

$merged = array_merge($neu, $neu_2);

foreach ($merged as $a)
{
   foreach ($a as $k => $v)
   {
    $opt .= "<option value=\"".$k."\">".$v."</option>";
   }
}

echo "<select>$opt</select>";

Ist jetzt wirklich nicht schön gelöst,
aber ich wollte den Gedanken vermitteln ;)
 
Viele Wege führen nach Rom....

Meins war nur ein beispiel zum verdeutlichen wie es aussehen könnte/müsste.

Ich weiß ja weder wieviele Werte es sind, noch woher die kommen (Fest oder aus der DB?) und auch nicht welches System genutzt wird...

deswegen Arbeite ich inzwischen lieber mit asp.net, da muß ich sowas nciht implementieren, das "automatisch" wieder gefüllt.
 
Drum gibts Template-Systeme und ordentliche Programmierung ;)