Using Form Input Arrays For Checkboxes

One way that I've gotten faster at XHTML forms is using input arrays whenever possible. Input arrays allow me to deal with just one variable for checkboxes that serve as multiple answers to one question. Here's how the process works.

Step 1: The XHTML Form

<table cellpadding="0" cellspacing="2">
	<tr>
		<td><input type="checkbox" name="how_hear[]" id="how_hear1" value="Website" <?php echo in_array('Website',$how_hear) ? 'checked="checked"' : ''; ?> /></td>
		<td style="padding-left:3px"><label for="how_hear1">Website</label></td>
	</tr>
	<tr>
		<td><input type="checkbox" name="how_hear[]" id="how_hear2" value="TV Commercial" <?php echo in_array('TV Commercial',$how_hear) ? 'checked="checked"' : ''; ?> /></td>
		<td style="padding-left:3px"><label for="how_hear2">TV Commercial</label></td>
	</tr>
	<tr>
		<td><input type="checkbox" name="how_hear[]" id="how_hear3" value="Magazine Ad" <?php echo in_array('Magazine Ad',$how_hear) ? 'checked="checked"' : ''; ?> /></td>
		<td style="padding-left:3px"><label for="how_hear3">Magazine Ad</label></td>
	</tr>
	<tr>
		<td><input type="checkbox" name="how_hear[]" id="how_hear4" value="Billboard" <?php echo in_array('Billboard',$how_hear) ? 'checked="checked"' : ''; ?> /></td>
		<td style="padding-left:3px"><label for="how_hear4">Billboard</label></td>
	</tr>
	<tr>
		<td><input type="checkbox" name="how_hear[]" id="how_hear5" value="Other" <?php echo in_array('Other',$how_hear) ? 'checked="checked"' : ''; ?> /></td>
		<td style="padding-left:3px"><label for="how_hear5">Other</label></td>
	</tr>
</table>

Note that the name attribute of each input is the same: how_hear[]. The brackets indicate that the input field is an array. Also note the PHP in each input tag that determines if the chechbox should checked initially.

Step 2: The PHP Form Validation and Processing

//initialize
$how_hear = count($_POST['how_hear']) ? $_POST['how_hear'] : array();

//echo out their choices separated by a comma
echo count($how_hear) ? implode(', ',$how_hear) : 'Nothing';

To avoid PHP warnings, we declare the $how_hear array at the very top.

PHP's count() function returns the number of items selected, so we you require at least one be checked, count() is what we'll use.

Lastly, to display the selections as a list, we use the implode() function.

That's it! Click here to see an example.


Comments

  1. Abraão Coelho

    I didn’t test yet but makes sense… It surely will help retrieving data from checkboxes (what was always trouble)…

    And I’m amazed how often you publish articles Dave, congrats =) I’m very happy I could find your blog and it’s been very helpful!

  2. Catar4x

    Great tips !
    I use this method for “Delete” :
    for ($i = 0; $i < count($_POST['delete']); $i++) {
    $requete = mysql_query(“DELETE FROM table
    WHERE id=’”.$_POST['delete'][$i].”‘”);
    }

  3. danny

    Catar4x OUCH! you know that this is vulnerable to sql injection? Never put request params into sql like that without escaping them for ‘, ; and ” otherwise someone could create a form which would post this.. 1′;drop table; select * from table where id=’
    mysql would execute three statements…

    DELETE FROM table WHERE id=’1′;

    drop table table;

    select * from table where id=$_POST['delete'][$i]

  4. didier

    how about xhtml validation?
    I’ve been using the [ ] brakets to pass arrays to php but this won’t validate as xhtml.

  5. Enrico

    Was quite simple, but this article saved a day of repeated stupid mistakes, thank you.

  6. dwargo

    name=”how_hear[]“… I’m in shock… How didn’t I know this?

    Thank you, you just saved me rewriting my class from scratch!

  7. Jeremías

    Hey!. I read you sometime, and… i dont understand ?.
    Example:
    $how_hear = count($_POST['how_hear']) ===>> ? <=== $_POST['how_hear'] : array();

    Can u explaned?. I begining with php.
    Thanks!

    • Carlos

      It is called a ternary operator it is short hand for an if statement
      (if this is true)? do this : else do this

  8. someone

    Jeremias,
    “? :” is a shorthand if/else statement at the same time, returning a value.
    for example;
    $how_hear = count($_POST['how_hear']) ? $_POST['how_hear'] : array();
    also means:
    if(count($_POST['how_hear']))
    {
    $how_hear = $_POST['how_hear'];
    }
    else
    {
    $how_hear=array();
    }
    refer to this http://davidwalsh.name/php-shorthand-if-else-ternary-operators

  9. pim

    @didier this is not true, the square brackets validate perfectly (I just checked). XHTML expects inputs to be enclosed in a fieldset tag though.


Be Heard!

Share your thoughts without being a jerk! And wrap your code in <code> tags, f00!

Name*:
Email*:
Website: