2009-08-08 12 views
6

Chcę użyć funkcji PHP Filter, aby szybko filtrować formularz i wyświetlać informacje zwrotne dla użytkownika. Niektóre pola w mojej formie są wymagane, inne nie.Używanie funkcji Filtruj PHP do sprawdzania poprawności, ale ignorowanie pustych pól niezapotrzebowanych.

Zamierzam użyć filter_input_array() do filtrowania wszystkich moich pól. Przekażę dane w wielu seriach. W ten sposób będę mógł wyświetlać wiele komunikatów o błędach.

Mam jeden problem: jak mogę zignorować puste pola, które nie są wymagane? Nie widziałem dla niego filtra.

Aktualizacja: Sprecyzowanie wymagań dotyczących filtrów i komunikatów o błędach:

chcę użyć filtrów do sprawdzenia:

  1. czy wszystkie wymagane pola są wypełnione
  2. Jeśli pola opcjonalne są wypełnione w; jeśli nie, to ignorowanie przez resztę procesu
  3. W przypadku pól, takich jak e-mail, PHONENUMBER itp są wypełnione.

Chcę wyświetlać komunikaty o błędach dla każdego rodzaju błędu, z maksimum 1 komunikat błędu na pole.

Odpowiedz

5

Funkcje filter_xyz_array() zwrócą wartość NULL dla elementu, który nie istnieje w tablicy wejściowej, np.

<?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); 

drukuje

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

isset() powraca false element zmienny/tablica zawierająca puste. Możesz użyć tego do zignorować elementów, które są ustawione na NULL przez funkcje filtra.
W zależności od tego, co filtrujesz i struktury tablicy zwróconej przez funkcję filtru, możesz nawet użyć array_filter() do "wyczyszczenia" tablicy.

2

Skończyło się na zastosowaniu niestandardowego rozwiązania inspirowanego odpowiedzią @VolkerK. Powinienem był powiedzieć jaśniej, czego chcę. Zaktualizowałem moje pytanie tymi informacjami.

Wciąż szukam łatwiejszego rozwiązania.

pierwsze, zrobiłem kilka tablic Wynik:

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

raz pierwszy filtrowane za wymagane pola:

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 
    } 
} 

następnie sprawdzić na pustych polach i załadować je ze standardową wartością

// 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]; 
    } 
} 

W ostatnim kroku zbuduję tablicę sprawdzania poprawności, niestandardowe komunikaty o błędach i zignoruję ignorowanie re pól, aby pominąć puste pola lub pól, które już miały błąd:

$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

filtry PHP: Posługiwanie wartości opcjonalne/opcjonalne wejścia forma z filter_input_array() funkcja filtrowania.

Pokażę prosty sposób obsługi zmiennych opcjonalnych lub formularzy podczas pracy z filtrami PHP. Zasada jest następująca:

  1. Filtrowanie wszystkich danych wejściowych formularza, wymagane & opcjonalnie. Nie pomijaj opcjonalnych pól w filtrze.
  2. pomocą operatora porównania === odróżnić FAŁSZ NULL i „” 0 wartości
kod

Przykładowy prosty forma kontaktu z 4 i 4 wymaga nakładów opcjonalnym poniżej

<?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); 
} 
} 
?> 

Wreszcie formularz HTML z sekcją wyświetlania błędów:

<!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> 
Powiązane problemy