2009-08-08 13 views
6

Quiero usar las funciones PHP Filter para filtrar rápidamente un formulario y mostrar comentarios al usuario. Algunos de los campos en mi formulario son obligatorios, otros no.Usar la función de filtro de PHP para validar, pero ignorar campos vacíos no obligatorios

Voy a utilizar filter_input_array() para filtrar todos mis campos. Pasaré los datos en varias ejecuciones. De esta forma, podré visualizar múltiples mensajes de error.

Tengo un problema: ¿cómo puedo ignorar los campos vacíos que no son necesarios? No vi un filtro para eso.

Actualización: Aclaración de los requisitos para los filtros y mensajes de error:

quiero usar filtros para comprobar:

  1. Si todos los campos requeridos están llenos de
  2. Si los campos opcionales están llenos en; si no, ignorar el resto del proceso
  3. Si campos como el correo electrónico, numero de teléfono, etc se rellenan.

Quiero mostrar mensajes de error para cada tipo de error, con un máximo de 1 mensaje de error por campo

Respuesta

5

Las funciones filter_xyz_array() devolverán NULL para un elemento que no existe en la matriz de entrada, p.

<?php 

$args = array(
    'foo' => array(
     'filter' => FILTER_VALIDATE_INT, 
     'flags'  => FILTER_REQUIRE_ARRAY, 
     'options' => array('min_range' => 1, 'max_range' => 4) 
    ), 
    'bar' => array(
     'filter' => FILTER_VALIDATE_INT, 
     'flags' => FILTER_REQUIRE_SCALAR 
    ) 
); 

$input = array(
    'foo'=>array(1,2,3,4) 
); 

$filtered = filter_var_array($input, $args); 
var_dump($filtered); 

grabados

array(2) { 
    ["foo"]=> 
    array(4) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    } 
    ["bar"]=> 
    NULL 
} 

isset() devuelve false para un elemento variable/matriz que contiene NULL. Puede usar eso para ignorar los elementos que las funciones de filtro establecen en NULL.
Dependiendo de lo que esté filtrando y la estructura de la matriz devuelta por la función de filtro, puede incluso usar array_filter() para "limpiar" la matriz.

2

Terminé usando una solución personalizada inspirada en la respuesta de @VolkerK. Debería haber declarado más claro lo que quería. He actualizado mi pregunta con esta información.

Todavía estoy buscando una solución más fácil.

En primer lugar, he hecho algunos arreglos de resultados:

// errors to display 
$errors = array(); 
// fields to ignore in the validation step 
$ignore_fields = array(); 
// return values after validation 
$returnvalues = array(); 

primera vez filtrada para los campos obligatorios:

function required($string){ 
return trim($string) == "" ? false : $string; 
} 

$required_errors = array(
    "firstname" => "Je moet je voornaam invullen.", 
    "lastname" => "Je moet je achternaam invullen.", 
    "email" => "Je moet je e-mailadres invullen." 
); 

$required_filter = array(); 
    foreach($required_errors as $requiredfieldname => $error){ 
    $required_filter[$requiredfieldname] = array(
     'filter' => FILTER_CALLBACK, 
     'options' => "required", 
     'flags' => FILTER_NULL_ON_FAILURE 
    ); 
} 

$required_filtered = filter_input_array(INPUT_GET | INPUT_POST, 
    $required_filter); 

foreach($required_errors as $required => $error){  
    if(!isset($required_filtered[$required])){ 
    $errors[$required] = $required_errors[$required]; 
    $returnvalues[$required] = ""; 
    $ignore_fields[$required] = "ignored"; // value doesn't matter 
    } 
} 

Luego de verificación de los campos vacíos y cargarlos con un valor estándar

// ignore the other fields if they are empty; 
// the actual form has about 10 values here 
$maybeempty = array("from", "to", "phonenumber"); 

$optional_defaultvalue = array(
    "from" => 0, 
    "to" => 0, 
    "phonenumber" => "", 
); 

$optional_filter = array(); 
foreach($maybeempty as $field){ 
    $required_filter[$requiredfieldname] = array(
    'filter' => FILTER_CALLBACK, 
    'options' => "required", 
    'flags' => FILTER_NULL_ON_FAILURE 
); 
} 

$optional_filtered = filter_input_array(INPUT_GET | INPUT_POST, 
    $required_filter); 
foreach($maybeempty as $field){ 
    if(!isset($optional_filtered[$field])){ 
    $ignore_fields[$field] = "ignored"; // value doesn't matter 
    $returnvalue[$field] = $optional_defaultvalue[$field]; 
    } 
} 

En el paso final, construiré una matriz de validación, mensajes de error personalizados e ignoraré la ignorancia re campos, para omitir los campos vacíos o campos que ya tenían un error:

$validity_filter = array(
    'email' => array(
     'filter' => FILTER_VALIDATE_EMAIL, 
     'flags' => FILTER_REQUIRE_SCALAR 
    ), 
    'from' => array(
     'filter' => FILTER_VALIDATE_INT, 
     'flags' => FILTER_REQUIRE_SCALAR, 
     'options' => array('min_range' => 1964, 'max_range' => 2009)), 
    'to' => array(
     'filter' => FILTER_VALIDATE_INT, 
     'flags' => FILTER_REQUIRE_SCALAR, 
     'options' => array('min_range' => 1964, 'max_range' => 2009)) 
); 

// filter all ignored fields 
$validity_filter = array_diff_key($validity_filter, $ignore_fields); 
$validity_filtered = filter_input_array(INPUT_GET | INPUT_POST, 
    $required_filter); 

foreach($validity_filter as $field => $value){ 
    if($value === false){ // NULL values are checked in a previous step 
    $errors[$field] = $validity_errors[$field]; // show error 
    $returnvalues[$field] = $_REQUEST[$field]; // return original value 
    } else { 
    $returnvalues[$field] = $value; // return filtered value 
    } 
} 

// process possible errors and response values 
3

filtros PHP: Manipulación valores opcionales/entradas de formulario opcionales con filter_input_array (función de filtro).

Demostraré una manera simple de manejar campos opcionales o entradas de formulario cuando se trabaja con filtros PHP. La regla de oro es:

  1. Filtra TODAS las entradas de formulario, requerido & opcional. No omita los campos opcionales en su filtro.
  2. Utilice el operador de comparación === diferenciar entre FALSE, NULL, "" y 0 valores
código

de ejemplo para un formulario de contacto sencillo con 4 requerido y 4 entradas opcionales se muestra a continuación

<?php 
if ($_SERVER["REQUEST_METHOD"] == "POST"){ 
/*set validation control variable*/ 
$input_error_flag = true; 

/*set form input validation filters*/ 
$form_filter = array(
    'first_name'  => FILTER_SANITIZE_STRING, 
    'middle_name'  => FILTER_SANITIZE_STRING, 
    'last_name'   => FILTER_SANITIZE_STRING, 
    'email_address'  => FILTER_SANITIZE_EMAIL, 
    'postal_address' => FILTER_SANITIZE_NUMBER_INT, 
    'street_address' => FILTER_SANITIZE_STRING, 
    'telephone_number' => FILTER_SANITIZE_NUMBER_INT, 
    'mobile_number'  => FILTER_SANITIZE_NUMBER_INT, 
); 

/*list optional fields or optional form inputs in array*/ 
$optional_fields = array(
    'middle_name'  => "", 'postal_address' => "", 
    'street_address' => "", 'mobile_number'  => "", 
    ); 

/*set error display message of each required element*/ 
$error_description = array(
    'first_name'  =>"Missing or incorrect First Name", 
    'last_name'   =>"Missing or incorrect Last Name", 
    'email_address'  =>"Missing or incorrect Email Address", 
    'telephone_number' =>"Missing or incorrect Telephone Number", 
    ); 

/*sanitize all form inputs against form_filter*/ 
$form_data = filter_input_array(INPUT_POST, $form_filter); 

/*check form inputs for filter validation errors*/ 
foreach ($form_data as $form_input => $value){ 
    /*check if filter failed (false), input not defined (null) or input missing ("") 
    * and insert name of form input element into $invalid_array for error display 
    */ 
    if($value === FALSE || $value === NULL || $value == ""){ 
     /*exclude error display for optional items with empty values*/ 
     if(!(array_key_exists($form_input, $optional_fields) && $value == "")){ 
      $invalid_inputs[] = $form_input; 
     } 
    } 
} 

/*unset filter validation control variable if no errors*/ 
if(empty ($invalid_inputs)) 
       $input_error_flag = false; 

/*your calls to SQL functions for INSERT or UPDATE statements go here*/ 
if(!$input_error_flag){ 
    functionname::getInstance()->insert_contact_details($form_data); 
} 
} 
?> 

Y finalmente el formulario html con la sección de visualización de error

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
    <title></title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    </head> 
    <body> 
    <form action="sample.php" method="POST" id="sample"> 
    <label for="first_name">First Name*</label> 
    <input type="text" name="first_name" id="first_name" 
      value="<?php echo $form_data['first_name']; ?>"/><br/> 
    <label for="middle_name">Middle Name</label> 
    <input type="text" name="middle_name" id="middle_name" 
      value="<?php echo $form_data['middle_name']; ?>"/><br/> 
    <label for="last_name">Last Name*</label> 
    <input type="text" name="last_name" id="last_name" 
      value="<?php echo $form_data['last_name']; ?>"/><br/> 
    <label for="email_address">Email Address*</label> 
    <input type="text" name="email_address" id="email_address" 
      value="<?php echo $form_data['email_address']; ?>"/><br/> 
    <label for="postal_address">Postal Address</label> 
    <input type="text" name="postal_address" id="postal_address" 
      value="<?php echo $form_data['postal_address']; ?>"/><br/> 
    <label for="street_address">Street Address</label> 
    <input type="text" name="street_address" id="street_address" 
      value="<?php echo $form_data['street_address']; ?>"/><br/> 
    <label for="telephone_number">Telephone Number*</label> 
    <input type="text" name="telephone_number" id="telephone_number" 
      value="<?php echo $form_data['telephone_number']; ?>"/><br/> 
    <label for="mobile_number">Mobile Number</label> 
    <input type="text" name="mobile_number" id="mobile_number" 
      value="<?php echo $form_data['mobile_number']; ?>"/><br/> 
    <input type="submit" name="submit" value="submit"><br/> 
     <?php 
      //display input validation errors on your html form 
      if ($input_error_flag){ 
       foreach($invalid_inputs as $key => $form_input){ 
        if(array_key_exists($form_input, $error_description)){ 
         echo $error_description[$form_input]."<br/>"; 
        } 
       } 
      } 
     ?> 
    </form> 
    </body> 
</html> 
Cuestiones relacionadas