Maciej Wira
Maciej Wira

Reputation: 159

PHP checkbox validation, if else issue

I have a checkbox in my HTML file:

<input type="checkbox" id="kopia" name="kopia" class="form-input" value="0">

I'm trying to pass to the PHP file (via AJAX) a couple of values, one of them is a boolean value created by a checkbox (simplified):

name: "kopia"
value: document.getElementById("kopia").checked

If I check via console, it returns true if checked and false if unchecked.

document.getElementById("kopia").checked

If I check via PHP file, it behaves the same:

echo $_POST['kopia']

But when I write something like this:

$checkbox = $_POST['kopia'];
if ($checkbox){
    echo "hey";
} else {echo "bye";}

It always returns "hey", no matter if the checkbox was checked or not. I don't get it. Even if I make something like this:

$checkbox = $_POST['kopia'];
if ($checkbox){
    echo $checkbox;
} else {echo "bye";}

It never returns "bye", no matter if the box was checked or not, but returns true if checked and false if unchecked. This thing has already stolen a couple of hours and that's a couple of hours too much. Any idea, hint?

Upvotes: 2

Views: 4754

Answers (2)

AbraCadaver
AbraCadaver

Reputation: 78994

Your are passing true or false in $_POST['kopia'] via the return of document.getElementById("kopia").checked, however $_POST values are strings in PHP. So both string "true" and string "false" will evaluate to boolean true in your current if condition. You can check the string value:

$checkbox = $_POST['kopia'];
if ($checkbox == "true"){
    echo $checkbox;
} else {
    echo "bye";
}

Or you can convert them to a boolean, see PHP: Validate Filters (thanks to Sysix):

$checkbox = filter_var($_POST['kopia'], FILTER_VALIDATE_BOOLEAN);

Or if you set $_POST['kopia'] to 0 or 1, those strings will be evaluated correctly in your current if condition.

Or you could abandon the JS value switching and just check if $_POST['kopia'] exists (only when checked):

if(isset($_POST['kopia'])) {
    echo "hey";
} else {
    echo "bye";
}

Upvotes: 3

Ulrik McArdle
Ulrik McArdle

Reputation: 654

You could make a simple check like this:

$isChecked = !empty($_POST['kopia']) ? true : false;
if($isChecked){
    echo 'Checked';
}
else{
    echo 'Not checked';
}

empty checks both isset and if 0 it equals false, if 1 it equals true and if not set it equals false.

Hopes this helps.

Upvotes: 0

Related Questions