Search code examples
phpfilteringfilter-var

Give filter_var() filter by passing a variable PHP (filter_var() expects parameter 2 to be long, string given)


Right now i'm trying to validate some postdata with filter_var(). I want to get the filter related to each input from my database. So if the input should be filtered by EMAIL, the variable would contain FILTER_VALIDATE_EMAIL. This would then be passed like so:

        foreach($this->postdata as $key => $input){
        if(!((empty($requirements[$key][1])) || $requirements == 'allowed')){
            if(filter_var($input, $requirements[$key][1]) === false){
                $errors = true;
            }
        }
    }

The $postdata looks like this:

    array (size=4)
  'personer_navn' => 
    array (size=1)
      0 => int 0
  'personer_alder' => 
    array (size=1)
      0 => int 1
  'personer_kon' => 
    array (size=2)
      0 => int 2
      1 => int 3
  'personer_by' => 
    array (size=1)
      0 => int 4

And the $requirements looks like this:

    array (size=4)
  'personer_navn' => 
    array (size=4)
      0 => string 'string' (length=6)
      1 => string 'FILTER_VALIDATE_EMAIL' (length=21)
      2 => string '' (length=0)
      3 => string '' (length=0)
  'personer_alder' => 
    array (size=4)
      0 => string 'int' (length=3)
      1 => string 'FILTER_VALIDATE_EMAIL' (length=21)
      2 => string '' (length=0)
      3 => string '' (length=0)
  'personer_kon' => 
    array (size=4)
      0 => string 'allowed' (length=7)
      1 => string 'allowed' (length=7)
      2 => string 'allowed' (length=7)
      3 => string 'allowed' (length=7)
  'personer_by' => 
    array (size=4)
      0 => string 'string' (length=6)
      1 => string 'FILTER_VALIDATE_EMAIL' (length=21)
      2 => string '' (length=0)
      3 => string '' (length=0)

Again the problem seems to ba passing $requirements[$key][1] to the filter_var() function.

Any help is appreciated.


Solution

  • A simple change that will fix the bug

    foreach($this->postdata as $key => $input){
            if(!((empty($requirements[$key][1])) || $requirements == 'allowed')){
                if(filter_var($input, constant( $requirements[$key][1]) ) === false){
                    $errors = true;
                }
            }
        }
    

    The constant function returns the (integer) value of the filter that is string.

    read P.P-s answer too.