tags:

views:

908

answers:

3

I am getting an "Undefined index" error when submitting a form with an un-checked checkbox. Is there any other way besides running an "isset" or "empty" check on each individual posted value?

I have looked at this Question and am having trouble believing that this is the only solution.

Below is some example code: EDIT: please not that these are not the actual names of the tables columns; they are named uniquely (like "postAddress, displayPhone, student, etc.)

A: 

try the following

<?php
//first part of the query
$query = "UPDATE table SET ";

$howManyCheckboxes = 5;
//for every checkbox , see if it exist , if it is, add it to the query
for($i=1;$i<=$howManyCheckboxes;$i++)
{
   if(isset($_POST['checkbox'.$i]))
   {
      $query = $query . " checkbox".$i."='".escape($_POST['checkbox'.$i])."',";
   }
}
//lets remove the last coma
$query = substr($query,0,-1);
//add the rest of the query
$query = $query . " LIMIT 1";

$result = mysql_query( $query );
if( ! $result ) echo "um, not everything went as expected.";
?>
PERR0_HUNTER
thanks for this, but the checkbox names are not always going to be "checkbox1","checkbox2"...
superUntitled
+2  A: 

You could write a function that checks whether a checkbox was checked:

function checkbox_value($name) {
    return (isset($_POST[$name]) ? 1 : 0);
}

Now call that function in your query like this:

$sql =  'UPDATE table SET '.
        'checkbox1 = '. checkbox_value('checkbox1') .','.
        'checkbox2 = '. checkbox_value('checkbox2') .','.
        'checkbox3 = '. checkbox_value('checkbox3') .','.
        'checkbox4 = '. checkbox_value('checkbox4') .','.
        'checkbox5 = '. checkbox_value('checkbox5') .','. "LIMIT 1";
yjerem
Yeah! I like the way you think. Thank you!
superUntitled
A: 

If you want a on/off checkbox you can write a hidden value before you write the checkbox.

<input type="hidden" name="checkbox1" value="no" />
<input type="checkbox" name="checkbox1" value="yes" />

This will always return a value, either no (default unless checkbox is checked by default) or yes.

You can validate input with the filter functions with FILTER_VALIDATE_BOOLEAN.

Its easier if you write a function for this, like formCheckbox($name), with options for values (value 'on' means checkbox is checked by default), attributes, etc.

OIS
Does this actually work? That's crazy... never heard of that before. It would depend on the browser though? I'm sure not all browsers support this even if it's in the w3c spec?
Mark
This works in all browsers I know about. The browsers return the names with values in order from first to last. In PHP only the last name will make it into GET/POST super globals (without name[]), and if the checkbox is not checked it will not be submitted.
OIS