michaelmcgurk
michaelmcgurk

Reputation: 6509

How to validate multiple inputs with PHP

I am using the following code to validate integer input fields in my form:

if (isset($_POST['MaxiVegXP']) && ctype_digit($_POST['MaxiVegXP']))
{
    $MaxiVegXP = $_POST['MaxiVegXP'];
} else {
    $MaxiVegXP = FALSE;
}

I have another 20 or so similar form input fields. Is there a quicker way of doing this with a PHP loop? I'd rather not do the above for another 20 input fields :-)

Upvotes: 1

Views: 2989

Answers (4)

Is there a quicker way of doing this with a PHP loop?

there's a quicker to do this without a PHP loop:

I would use filter_input_array. This code will assign null to the value if it does not pass the filter. It's quite practical, you just have to add the name of the variable and it's desired filter in the array.

$vars = filter_input_array(INPUT_POST,array (
  'MaxiVegXP'=>FILTER_VALIDATE_INT,
  'myVar'=>FILTER_DEFAULT, 
// or FILTER_VALIDATE_INT. you can also define validator callbacks if need be
));

here you define the keys you wish to get from the input ($_POST in this example, but you can use INPUT_GET to get variables from the $_GET superglobal). You can also define more advanced options in the array to define a min or max range for your inputs, for instance

$vars = filter_input_array(INPUT_POST,array (
  'MaxiVegXP'=>array(
    'filter'=>FILTER_VALIDATE_INT,
    'options'=>array('min_range'=>1, 'max_range'=>10),
  ),
));

the usefulness is that you don't have to verify manually for each key if they exist and what type they're of, filter_input_array takes care of that once you've defined your array of accepted value

Upvotes: 1

Darin Peterson
Darin Peterson

Reputation: 1282

I would do something like @Simply Dread, but with a slight improvement, so I could explicitly indicate which fields needed to be fixed:

$validFields = array('field1' => true, 'field2' => true, 'field3' => true, ..., 'fieldN' => true);

foreach ($validFields as $field => $valid) {
    if (!isset($_POST[$field]) && !ctype_digit($_POST[$field])) {
        $validFields[$field] = false;
    }
}

With this information, I can now show errors on the appropriate fields instead of only saying that there is a problem.

Upvotes: 3

Rabbit
Rabbit

Reputation: 314

You could iterate over all fields for example:

foreach ($_POST as $key=>$value){
    if (isset($_POST[$key]) && ctype_digit($_POST[$key])) {
        $$key = $value;
    } else {
        $$key = FALSE;
    }
}

But I would instead put the code in a function and call the fuction excplicitly for every post variable:

function isDigit($value) {
    if (isset($value) && ctype_digit($value)) {
        return true;
    }
    return false;
}

$MaxiVegXP = isDigit($_POST["MaxiVegXP"]) ? $_POST["MaxiVegXP"] : false;

Upvotes: 1

Edwin
Edwin

Reputation: 1135

An option would be to create an array of the field names and loop over it. Doing it this way will ensure all fields have to be set and are digits. Check the validate variable afterwards and you'll know if it was successful. :-)

$fieldArray = array('fieldOne', 'fieldTwo', 'fieldThree');
$validate = true;

foreach ($fieldArray as $field) {
    if (!isset($_POST[$field]) && !ctype_digit($_POST[$field])) {
        $validate = false;
    }
}

Upvotes: 1

Related Questions