Saturday, February 5, 2011

PHP: Retrieving value of checkboxes when name doesn't have array

A form I don't have any control over is POSTing data to my PHP script. The form contains checkboxes along these lines:

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

If I were to write the code for the form, I'd write name="option[]" instead of name="option". But this is not a change I can do. Now, if both checkboxes are checked, $_POST["option"] returns just one of the values. How can I, in PHP retrieve all the values selected?

  • You can read the raw post data. For example:

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

    Check both boxes and the output will be:

    option=val1&option=val2
    

    Here's a live demo. All you have to do then is to parse the string yourself, into a suitable format. Here's an example of a function that does something like that:

    function parse($data)
    {
        $pairs = explode("&", $data);
        $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 ($keys[$k] > 1) {
                if (!array_key_exists($k, $output)) {
                    $output[$k] = array($v);
                } else {
                    $output[$k][] = $v;
                }
            } else {
                $output[$k] = $v;
            }
        }
    
        return $output;
    }
    
    $data = "foo=bar&option=val1&option=val2";
    
    print_r(parse($data));
    

    Outputs:

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

    There might be a few cases where this function doesn't work as expected though, so be careful.

    Ian Elliott : Nice, didn't know that
    Jani Hartikainen : Depending on your PHP settings you may not be able to use file_get_contents on the php://input stream. In this case, you will need to use fopen('php://input', 'r') and stream_get_contents($fp)
    chendral : What PHP settings would that be?
    From Emil H
  • Thaks for the great explanation :) You people are sooo good..

0 comments:

Post a Comment