2009-07-03 4 views
4

Ein Formular, das ich nicht kontrollieren kann, besteht darin, Daten an mein PHP-Skript zu senden. Das Formular enthält Kontrollkästchen in diese Richtung:PHP: Abrufen von Checkboxen, wenn der Name kein Array hat

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

Wenn ich den Code für das Formular schreiben war, ich name="option[]" statt name="option" schreiben würde. Aber das ist keine Veränderung, die ich machen kann. Wenn beide Kontrollkästchen aktiviert sind, gibt $_POST["option"] nur einen der Werte zurück. Wie kann ich in PHP alle ausgewählten Werte abrufen?

+0

Irgendein Grund für das Wiki? –

+0

Ian, meinst du das Community Wiki zu aktivieren? Ich mache es auch möglich, damit die Leute die Frage verbessern können, wie sie es für richtig halten. – avernet

Antwort

14

Sie können die Rohpostdaten 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> 

prüfen beiden Boxen und der Ausgang werden sein:

option=val1&option=val2 

hier ein live demo sind. Alles, was Sie dann tun müssen, ist, die Saite selbst in ein geeignetes Format zu zerlegen. Hier ist ein Beispiel einer 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 
     ) 

) 

Es könnte ein paar Fälle, in denen diese Funktion nicht wie erwartet allerdings nicht funktioniert, so vorsichtig sein.

+0

Schön, wusste nicht, dass –

+2

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

+1

Welche PHP-Einstellungen wären das? – chendral

Verwandte Themen