Antwort an „Rolf B“ verfassen

Hallo Gerald,

ich habe viel zu meckern, aber irgendwo darin ist auch die Antwort auf deine Frage 😉

$HTTP_POST_VARS['Auswahl'] = "1";

PHP 5.4 guckt verwirrt: „DAS HABE ICH DOCH ABGESCHAFFT!“. Welche PHP Version verwendest Du?

Bereits seit PHP 4.1 gibt es $_GET und $_POST, um auf URL-Parameter und POST-Body zuzugreifen. Diese Variablen werden intern anders konstruiert und haben Performancevorteile. In PHP 5 gab es anfangs noch Kompatibilitätsoptionen, um die Langversion (also $HTTP_GET_VARS und $HTTP_POST_VARS) zu simulieren, aber mit PHP 5.4 wurde das endgültig abgeschafft. Es gab sicher auch Gründe für die Umbenennung, aber die kenne ich nicht.

Ich weiß auch gar nicht, warum Du das zuweist, zumindest im gezeigten Code verwendest Du es nicht. Eine Zuweisung an $HTTP_POST_VARS wird nicht in $_POST reflektiert. Deshalb funktioniert dein Code nicht.

Und dann hast Du ein mächtig umständliches Konstrukt in der Schleife. Das sieht - abstrahiert - so aus:

if (bedingung) {
   aktion 1;
   aktion 2;
}
else {
   aktion 2;
}

Solche Code-Duplikate sind extrem fehleranfällig, wenn man etwas am Programm ändert, muss man immer darauf achten, beides zu ändern. Daher kommt das Clean Code Prinzip DRY (don't repeat yourself). In deinem Fall wäre das so besser:

if (bedingung) {
   aktion 1;
}
aktion 2;

Und wenn Du das tust, erkennst Du, dass diese Abfrage gar nicht in der Schleife stehen muss.

if ($_POST['Auswahl']=="")

Ich würde Dir empfehlen, vor der foreach-Schleife zu testen, ob dieser Wert überhaupt existiert. Wenn in der Radiogruppe nichts ausgewählt ist, fehlt der Eintrag nämlich und es gibt eine Warning zu einem fehlenden Array-Key. Ab PHP 7 macht Dir der "null coalescing operator" ?? das Leben dafür leichter:

$auswahl = $_POST['Auswahl'] ?? "1";

Der ?? Operator liefert das, was links von ihm steht, solange es ein definierter Wert ist. Er unterdrückt auch die Warnmeldung zum fehlenden Key. Fehlt der Array-Eintrag oder enthält das Array an dieser Stelle NULL, bekommst Du den Wert rechts vom ??.

Diese eine Zeile schreibt Dir also in $auswahl den value des gewählten Radiobuttons, oder "1", wenn keiner ausgewählt ist.

Als nächstes solltest Du sicherstellen, dass diese Auswahl auch gültig ist:

if (!array_key_exists($auswahl, $WZ)) {
   $auswahl = "1";
}

Ggf. ist ein unbekannter Wert für $auswahl sogar eine Fehlerbedingung.

Dann noch zum input-Element und seiner Erzeugung:

<input type="radio" name="Auswahl"  value="<?php echo $wert; ?>" 
		<?php if ($wert == $_POST['Auswahl']) { echo 'checked="checked"'; $test = $bezeichner; } ?>>
        <?php  
         echo $bezeichner;  

Schade eigentlich, dass Du meine Hinweise für modernen PHP Code einfach ignorierst.

  • Statt <?php echo $wert ?> verwendet man <?= $wert ?>.
  • Statt einer IF-Anweisung kannst Du den bedingten Operator ?: verwenden
  • checked="checked" braucht man nur, wenn man XML-kompatibel sein will (also XHTML oder polyglottes HTML). Ansonsten reicht einfach checked.

Schade auch, dass Du meinen Hinweis zur Zugänglichkeit ignorierst. Ein input-Element braucht zwingend ein Label. Die Verbindung zwischen den beiden muss über eine ID hergestellt werden. Es gibt zwar auch die Möglichkeit, das input-Element als Kind-Element des labels zu erstellen, aber es gibt wohl Screenreader-Software, die damit nicht klarkommt.

<?php

// ...

$auswahl = $_POST['Auswahl'] ?? "1";
if (!array_key_exists($auswahl, $WZ)) {
   $auswahl = "1";
}
$id_nr = 0;
foreach ($WZ as $wert => $bezeichner):
   $id_nr += 1;
   $id = "radio_$id_nr";
?>
   <input type="radio" id="<?= $id ?>"
          name="Auswahl"  value="<?= $wert ?>"
          <?= ($wert == $auswahl) ? "checked" : "" ?>>
   <label for="<?= $id ?>"><?= $bezeichner ?></label>
<?php
endforeach;

Ob Variablennamen wie $wert und $bezeichner passend sind, kann man diskutieren. Ich hätte ja direkt die Menge im value-Attribut gespeichert und ein normales Array genommen, kein assoziatives Array. Die Existenzabfrage kann man dann mit in_array($auswahl, $WZ) machen. Aber das ist Deine Sache.

Und dann noch

<input name="submit" type="submit"> 

Dafür nimmt man heutzutage das <button>-Element. Vorteil ist, dass man seinen Inhalt einfacher festlegen kann. Du hast keinen value festgelegt, deswegen wird der Browser da "Senden" anzeigen, und du wirst in $_POST['submit'] auch den Wert "Senden" vorfinden. Spätestens wenn Du mehr als einen Submit-Button hast, wird das umständlich. Da sollte man einen Namen mit unterschiedlichen Values haben, und je nach Value die Aktion auswählen.

Der Nachteil von <input> ist, dass der angezeigte Text und der value identisch sind, d.h. du hast eine Abhängigkeit zur Textdarstellung in deinem Programmcode. Das ist unschön. Der Button trennt das:

<button type="submit" name="rente" value="rechnen">Berechnen</button>

Du kannst bei <button> sogar ein Icon zum Text hinzufügen, das geht bei <input> nicht.

Rolf

--
sumpsi - posui - obstruxi
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen