4 Stimmen

PHP: Abrufen des Wertes von Checkboxen, wenn der Name kein Array hat

Ein Formular, über das ich keine Kontrolle habe, sendet Daten an mein PHP-Skript. Das Formular enthält Kontrollkästchen in dieser Form:

<input type="checkbox" value="val1" name="option"/>
<input type="checkbox" value="val2" name="option"/>

Wenn ich den Code für das Formular schreiben würde, würde ich schreiben name="option[]" anstelle von name="option" . Aber diese Änderung kann ich nicht vornehmen. Nun, wenn beide Kontrollkästchen aktiviert sind, $_POST["option"] gibt nur einen der Werte zurück. Wie kann ich in PHP alle ausgewählten Werte abrufen?

0 Stimmen

Gibt es einen Grund für das Wiki?

0 Stimmen

Ian, du meinst für die Aktivierung des Community-Wikis? Ich aktiviere es auch, damit die Leute die Frage nach eigenem Gutdünken verbessern können.

14voto

Emil H Punkte 38928

Sie können die Rohdaten der Post lesen. Zum Beispiel:

<fieldset>
    <legend>Data</legend>
    <?php
    $data = file_get_contents("php://input");
    echo $data."<br />";
    ?>
</fieldset>

<fieldset>
    <legend>Form</legend>
    <form method="post" action="formtest.php">
        <input type="checkbox" value="val1" name="option"/><br />
        <input type="checkbox" value="val2" name="option"/><br />
        <input type="submit" />
    </form>
</fieldset>

Markieren Sie beide Kästchen, und die Ausgabe wird sein:

option=val1&option=val2

Hier ist ein Live-Demo . Sie müssen die Zeichenfolge dann nur noch selbst in ein geeignetes Format parsen. Hier ist ein Beispiel für eine Funktion, die so etwas tut:

function parse($data)
{
    $pairs = explode("&", $data);

    // process all key/value pairs and count which keys
    // appear multiple times
    $keys = array();
    foreach ($pairs as $pair) {
        list($k,$v) = explode("=", $pair);
        if (array_key_exists($k, $keys)) {
            $keys[$k]++;
        } else {
            $keys[$k] = 1;
        }
    }

    $output = array();
    foreach ($pairs as $pair) {
        list($k,$v) = explode("=", $pair);
        // if there are more than a single value for this
        // key we initialize a subarray and add all the values
        if ($keys[$k] > 1) {
            if (!array_key_exists($k, $output)) {
                $output[$k] = array($v);
            } else {
                $output[$k][] = $v;
            }
        } 
        // otherwise we just add them directly to the array
        else {
            $output[$k] = $v;
        }
    }

    return $output;
}

$data = "foo=bar&option=val1&option=val2";

print_r(parse($data));

Ausgänge:

Array
(
    [foo] => bar
    [option] => Array
        (
            [0] => val1
            [1] => val2
        )

)

In einigen wenigen Fällen kann diese Funktion jedoch nicht wie erwartet funktionieren, seien Sie also vorsichtig.

2 Stimmen

Abhängig von Ihren PHP-Einstellungen können Sie file_get_contents möglicherweise nicht für den php://input-Stream verwenden. In diesem Fall müssen Sie fopen('php://input', 'r') und stream_get_contents($fp) verwenden.

1 Stimmen

Welche PHP-Einstellungen könnten das sein?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X