2009-07-03 4 views
4

Un formulaire sur lequel je n'ai aucun contrôle POSTe des données dans mon script PHP. Le formulaire contient des cases à cocher le long de ces lignes:PHP: Récupération de la valeur des cases à cocher lorsque le nom n'a pas de tableau

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

Si je devais écrire le code pour la forme, j'écrire name="option[]" au lieu de name="option". Mais ce n'est pas un changement que je peux faire. Maintenant, si les deux cases à cocher sont cochées, $_POST["option"] renvoie une seule des valeurs. Comment puis-je, en PHP, récupérer toutes les valeurs sélectionnées?

+0

Une raison pour le wiki? –

+0

Ian, vous voulez dire activer le wiki de la communauté? Je le permets également, afin que les gens puissent améliorer la question comme bon leur semble. – avernet

Répondre

14

Vous pouvez lire les données brutes. Par exemple:

<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> 

cocher les deux cases et la sortie sera:

option=val1&option=val2 

est ici un live demo. Tout ce que vous avez à faire est alors d'analyser la chaîne vous-même, dans un format approprié. Voici un exemple d'une fonction qui fait quelque chose comme ça:

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)); 

Sorties:

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

) 

Il pourrait y avoir quelques cas où cette fonction ne fonctionne pas comme prévu, donc soyez prudent.

+0

Nice, je ne le savais pas –

+2

Selon vos paramètres PHP, vous ne pourrez peut-être pas utiliser file_get_contents dans le flux d'entrée php: //. Dans ce cas, vous devrez utiliser fopen ('php: // input', 'r') et stream_get_contents ($ fp) –

+1

Quels seraient les paramètres de PHP? – chendral

Questions connexes