2009-08-08 4 views
6

Ich möchte die PHP Filter Funktionen verwenden, um schnell ein Formular zu filtern und Feedback an den Benutzer anzuzeigen. Einige der Felder in meiner Form sind erforderlich, andere nicht.Mit PHP-Filter-Funktion zu validieren, aber leere nicht benötigte Felder zu ignorieren

Ich werde filter_input_array() verwenden, um alle meine Felder zu filtern. Ich werde die Daten in mehreren Läufen durchlaufen. Auf diese Weise kann ich mehrere Fehlermeldungen anzeigen.

Ich habe ein Problem: Wie kann ich leere Felder ignorieren, die nicht benötigt werden? Ich habe keinen Filter dafür gesehen.

Update: Klärung der Anforderungen an die Filter und Fehlermeldungen:

Ich möchte Filter verwenden, um zu überprüfen:

  1. Wenn alle erforderlichen Felder in
  2. gefüllt Wenn optionale Felder ausgefüllt sind im; wenn nicht, ignoriert den Rest des Prozesses
  3. Wenn Felder wie E-Mail, Telefonnummer, etc. ausgefüllt.

Ich mag für jede Art von Fehler-Fehlermeldungen angezeigt wird, mit einem Maximum von 1 Fehlermeldung pro Feld

Antwort

5

Die Funktionen filter_xyz_array() geben NULL für ein Element zurück, das nicht im Eingabearray vorhanden ist, z.

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

Drucke

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

isset() falsche Rückkehr für eine Variable/Array-Element, das NULL enthält. Sie können das verwenden, Ignorieren die Elemente, die von den Filterfunktionen auf NULL festgelegt werden.
Je nachdem, was Sie filtern und die Struktur des Arrays zurückgegeben von der Filterfunktion können Sie sogar array_filter() die "bereinigen" das Array verwenden.

2

Ich verwendete eine benutzerdefinierte Lösung, die von der Antwort von @VolkerK inspiriert wurde. Ich hätte klarstellen sollen, was ich wollte. Ich habe meine Frage mit diesen Informationen aktualisiert.

Ich bin immer noch auf der Suche nach einer einfacheren Lösung.

Erstens, ich habe einige Ergebnis-Arrays:

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

ich zum ersten Mal für die erforderlichen Felder gefiltert:

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

Dann gilt für die leeren Felder überprüfen und sie mit einem Standardwert laden

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

Im letzten Schritt werde ich ein Validierungs-Array erstellen, benutzerdefinierte Fehlermeldungen und Igno ignorieren re Felder, um leere Felder oder Felder zu überspringen, die bereits einen Fehler hatte:

$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

PHP Filter: Handhabung optionale Werte/optional Form Eingänge mit filter_input_array() Filterfunktion.

Ich demonstriere eine einfache Möglichkeit, wie man mit optionalen Feldern oder Formulareingaben umgehen kann, wenn man mit PHP-Filtern arbeitet. Die Faustregel lautet:

  1. Filter ALLE Formulareingaben, erforderlich & optional. Lassen Sie keine optionalen Felder in Ihrem Filter aus.
  2. Verwenden Sie den Vergleichsoperator === zwischen FALSE, NULL „“ und 0-Wert

Beispielcode für eine einfache Kontakt mit der Form 4 und 4 erforderlich optionalen Eingängen ist unten gezeigt

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

Und schließlich das HTML-Formular mit der Fehleranzeige Abschnitt

<!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> 
Verwandte Themen