我想使用PHP Filter函数快速过滤表单并向用户显示反馈。我的表格中的一些字段是必需的,有些则不是。
我将使用filter_input_array()
来过滤我的所有字段。我会在多次运行中传递数据。通过这种方式,我将能够显示多条错误消息。
我有一个问题:如何忽略不需要的空字段?我没有看到它的过滤器。
更新:澄清过滤器和错误消息的要求:
我想使用过滤器来检查:
我想为每种类型的错误显示错误消息,每个字段最多显示1条错误消息。
答案 0 :(得分:5)
filter_xyz_array()函数将为输入数组中不存在的元素返回NULL,例如
<?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);
打印
array(2) {
["foo"]=>
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
}
["bar"]=>
NULL
}
对于包含NULL的变量/数组元素,isset()返回false。您可以使用它来忽略过滤器函数设置为NULL的元素 根据您过滤的内容和过滤器函数返回的数组结构,您甚至可以使用array_filter()“清理”数组。
答案 1 :(得分:3)
PHP过滤器:使用filter_input_array()过滤函数处理可选值/可选表单输入。
我将演示一种在使用PHP过滤器时如何处理可选字段或表单输入的简单方法。经验法则是:
具有4个必需输入和4个可选输入的简单联系表格的示例代码如下所示
<?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);
}
}
?>
最后是带有错误显示部分的html表单
<!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>
答案 2 :(得分:2)
我最终使用了受@ VolkerK答案启发的自定义解决方案。我应该更清楚地说明我想要的东西。我用这些信息更新了我的问题。
我仍在寻找更简单的解决方案。
首先,我制作了一些结果数组:
// errors to display
$errors = array();
// fields to ignore in the validation step
$ignore_fields = array();
// return values after validation
$returnvalues = array();
我首先过滤了必填字段:
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
}
}
然后检查空字段并使用标准值
加载它们// 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];
}
}
在最后一步中,我将构建验证数组,自定义错误消息并忽略忽略字段,以跳过已出现错误的空字段或字段:
$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