Checkboxen reloaded

Post von realloc | Einsortiert in Code am 19. Juli 2007 | Keine Kommentare

Manche Tatsachen nimmt als selbstverständlich hin. Wie zum Beispiel die Tatsache, dass eine <input type=”checkbox”/> beim Ausführen einer Formularaktion nur übertragen wird, wenn diese auch mit einem Häkchen versehen wurde. Das gleiche gilt in abgewandelter Form übrigens auch für die Radiobuttons (wobei man hier mit checked=”checked” für eine Voreinstellung dem Problem entgegenwirken kann). Das Wissen um das Verhalten einer HTML-Form-Elemente ist wichtig. Auch wenn uns PHP das Leben beim Form-Handling sehr leicht macht.

Für den Fall, dass unser Formular eine Tabelle ist, in der sich beispielsweise mehrere Datensätze einer Datenbank-Tabelle befinden, die bearbeitet werden sollen, kann man mit der Benennung der Eingabefelder signalisieren, dass es sich um Array-Elemente handelt. Mit der Angabe <input type=”text” name=”name[]“/> wird nach dem Betätigen des Submit-Buttons ein Element in $_POST['name'][0] zu finden sein. Und hier lauert – in Verbindung mit dem Checkbox-Radiobutton-Problem – schon der nächste Fallstrick. Folgendes Formular verhält sich nämlich bestenfalls undefiniert:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <table>
        <tr>
            <th>Item</th>
            <th>Name</th>
            <th>Available</th>
            <th>Ordered</th>
        </tr>
        <tr>
            <td>1</td>
            <td><input type="text" name="name[]"/></td>
            <td><input type="checkbox" name="available[]" value="1"/></td>
            <td>
                <input type="radio" name="ordered[]" value="1"/> Y
                <input type="radio" name="ordered[]" value="0"/> N
            </td>
        </tr>
        <tr>
            <td>1</td>
            <td><input type="text" name="name[]"/></td>
            <td><input type="checkbox" name="available[]" value="1"/></td>
            <td>
                <input type="radio" name="ordered[]" value="1"/> Y
                <input type="radio" name="ordered[]" value="0"/> N
            </td>
        </tr>
    </table>
    <input type="submit"/>
</form>

Sollte die erste Checkbox nicht angewählt worden sein, wird im $_POST-Array die zweite Checkbox fälschlicherweise als erstes Element übertragen. Die Lösung ist sowohl simpel als auch wirkungsvoll. Sollten die Daten aus einer DB kommen, verfügt man in den meisten Fällen sowieso über eine ID, die den primären Schlüssel darstellt. Dieser muss dann nicht mehr in einem versteckten Formularfeld übertragen werden, sondern kann in den einzelnen Eingabefeldern benutzt werden. Wenn man nun <input type=”text” name=”name[1]“/> schreibt bzw. beim Auslesen der DB generiert, ist die Integrität der Daten gewährleistet. Folgender Code veranschaulicht das nun auch erleichterte Auswerten der übertragenen Daten:

<form action="<?php echo $_SERVER[‘PHP_SELF’]; ?>" method="post">
    <table>
        <tr>
            <th>Item</th>
            <th>Name</th>
            <th>Available</th>
            <th>Ordered</th>
        </tr>
        <tr>
            <td>1</td>
            <td><input type="text" name="name[1]"/></td>
            <td><input type="checkbox" name="available[1]" value="1"/></td>
            <td>
                <input type="radio" name="ordered[1]" value="1"/> Y
                <input type="radio" name="ordered[1]" value="0"/> N
            </td>
        </tr>
        <tr>
            <td>1</td>
            <td><input type="text" name="name[2]"/></td>
            <td><input type="checkbox" name="available[2]" value="1"/></td>
            <td>
                <input type="radio" name="ordered[2]" value="1"/> Y
                <input type="radio" name="ordered[2]" value="0"/> N
            </td>
        </tr>
    </table>
    <input type="submit" name="submit"/>
</form>
<p>
<?php

if (isset ($_POST[‘submit’])) {
    foreach ($_POST[‘name’] as $key => $value) {
        echo
            "Datensatz " . $key . " => " .
            "Name: " . (!empty ($_POST[$name][$key]) ? $_POST[$name][$key]:‘No name’) .
            ", Available: " . (isset ($_POST[‘available’][$key]) ? ‘Y’:‘N’) .
            ", Ordered: " . (!empty ($_POST[‘ordered’][$key]) ? ‘Y’:‘N’) . "<br />";
    }
}

?>
</p>

Have fun!

Möglicherweise interessiert Dich auch...

Einen Kommentar schreiben