开发者

Checkbox "checked"-value jumps up to earlier array values, when array is empty

开发者 https://www.devze.com 2023-03-14 11:35 出处:网络
I have an array of checkboxes name=\"box[]\". Through PHP I make sure that they\'re checked after they\'re submitted by echoing \"checked=\'checked\'\" if they were checked at submit event.

I have an array of checkboxes name="box[]". Through PHP I make sure that they're checked after they're submitted by echoing "checked='checked'" if they were checked at submit event.

Now, if I check the third box, the value jumps down to the first checkbox after submit, since the array was empty up until the third checkbox. Same, if I check the 2nd and 3rd checkbox, they jump down to 1st and 2nd after submit. This is the code I'm using:

<form method="post">
    <input type="checkbox" name="box[]" value="true" <?php if ($box[0] == true) echo "checked='che开发者_Python百科cked'"; ?>><br>
    <input type="checkbox" name="box[]" value="true" <?php if ($box[1] == true) echo "checked='checked'"; ?>><br>
    <input type="checkbox" name="box[]" value="true" <?php if ($box[2] == true) echo "checked='checked'"; ?>><br>
    <p>
    <input type="submit" value="Submit">
</form>

Try it at: http://experiencerapanui.com/selecttest.php

Can I make the checkboxes fill up the array with a value "false" or whatever, if the box is unchecked? Which way should I go?

****** EDIT ******

Thanks to phant0m, I managed to come up with a solution:

<form method="post">
    <input type="checkbox" name="box[]" value="1" <?php if (in_array("1", $box)) echo "checked='checked'"; ?>><br>
    <input type="checkbox" name="box[]" value="2" <?php if (in_array("2", $box)) echo "checked='checked'"; ?>><br>
    <input type="checkbox" name="box[]" value="3" <?php if (in_array("3", $box)) echo "checked='checked'"; ?>><br>
    <p>
    <input type="submit" value="Submit">
</form>

Putting unique values for the checkboxes, then if I find the value in the array $box[], the box is marked as checked.


This does not work, because only those checkboxes, that are checked, are being put into the $box array.

Either use different names, or different values to distinguish between them.

Consider this: You check the second and the third checkbox. In PHP, you will receive:

$_POST['box'] = array(0 => "true", 1 => "true");

You cannot know, which checkboxes have been checked, unless all of them are.


The POST value should start with isset, then !empty($array) determines if the POST value is an array and prevents a null array error when no options are selected.

&& is_array($_POST['box']) could be used in addition to !empty($_POST['box']) as well to check the validity of the array.

A variable is used in the following examples for the value field, as it makes it easier to define and populate inputs when using a foreach loop and may be sanitized if needed as a preventive measure.

It would probably be a good idea to sanitize the $_POST array also, and enclosing it in a function with the validation would allow it all to be called from the checkbox input and keep the input area tidy.

<input type="checkbox" name="box[]" value="<?php echo $unique_id; ?>" <?php if(isset($_POST['box']) && !empty($_POST['box']) && in_array($unique_id, $_POST['box'])) echo "checked='checked'"; ?>>

OR

<input type="checkbox" name="box[]" value="<?php echo $unique_id; ?>" <?php my_function(); ?>>

Excellent question and solutions! There seem to be relatively few examples that use an array method to preserve Post selections, and the one provided here is relevant and very helpful even years later.

0

精彩评论

暂无评论...
验证码 换一张
取 消