[英]Avoiding messy validation code
我目前正在为我的网站制作一个简单的登录/注册系统,对部分代码我不太满意。
我有一个脚本,用于检查注册表中的任何字段是否为空,并给出正确的响应,例如,如果您忘记输入名字,它会告诉您“名字不能为空”。
我的问题是我的代码当前如下所示:
if(field1 != ""){
if(field2 != ""){
if(field3 !=""){
//register user
}else{
//field3 empty error
}
}else{
//field2 empty error
}
}else{
//field1 empty error
}
有没有更清洁,更有效的方法可以使我确切地显示哪些字段为空?
您可以尝试如下操作:
<?php
$errors = [];
if ($field1 === '') {
$errors['field1'] = 'Empty error.'.
}
if ($field2 === '') {
$errors['field2'] = 'Empty error.'.
}
if ($field3 === '') {
$errors['field3'] = 'Empty error.'.
}
if (count($errors) === 0) {
// Registration
} else {
// Error
}
您可以将foreach
循环与字段数组和验证消息一起使用。 只需将表单字段放在另一个数组中( $form
)(或使用变量变量)。
$fields = [
'field1' => 'empty field1',
'field2' => 'empty field2',
'field3' => 'empty field3'
];
$errors = [];
foreach ($fields as $field => $message){
if ($form[$field] !== ''){
$errors[$field] => $message;
}
}
if ($errors){
//report errors
}
奖励:您可以向$fields
数组添加不同的验证规则。 我将使用beberlei / assert库,但是您可以选择任何想要的东西。
use Assert\Assertion;
$fields = [
'field1' => ['message' => 'empty field1', 'rule' => 'notEmpty'
];
$errors = [];
foreach ($fields as $field => $rules){
try {
call_user_func_array('Assertion::' . $rules['rule'], [$form[$field], $rules['message']]);
} catch(AssertionFailedException $e) {
$e->getValue(); // the value that caused the failure
}
}
您可以使用elseif ,并颠倒逻辑以首先测试一切是否整洁:
if( $field1 =="" ){ $error = "no field1 value"; }
elseif( $field2 =="" ){ $error = "no field2 value"; }
elseif( $field3 =="" ){ $error = "no field3 value"; }
else{
// your magic here, everything is clean.
}
或者,您可以使用数组并一次性记住所有错误:
$errors = [];
if( $field1 =="" ){ $errors[] = "no field1 value"; }
if( $field2 =="" ){ $errors[] = "no field2 value"; }
if( $field3 =="" ){ $errors[] = "no field3 value"; }
// Again, first check if we have any problems:
if( count($errors)!==0 ){
echo "something was incorrect:<br />".implode("<br />", $errors);
}
else{
// your magic here, everything is clean.
}
像这样的样式呢:
$aErrors = array();
if(field1 == "") {
$aErrors[] = 'error 1';
}
if(field2 == "") {
$aErrors[] = 'error 2';
}
if(field3 == "") {
$aErrors[] = 'error 3';
}
if(empty($aErrors)) register();
else print_errors();
在单独的php
文件上使用验证功能并将其包含在所需的任何页面上总是很好的。
对于您正在执行的状态检查,您可以使用简单的foreach loop
检查所有必填字段是否为空。
在您的register.php
页面上:
$required_fields = array('first_name','last_name', 'phone', 'email', 'password');
validate_has_presense($required_fields);
在validation_functions.php
页面上
function has_presense($value){
return isset($value)&& $value !== "";
}
function validate_has_presense($required_fields){
global $errors;
foreach ($required_fields as $field){
$value = trim($_POST[$field]);
if(!has_presense($value)){
$errors[$field] = "Please enter ".str_replace("_", " ", $field);
}
}
}
使用这种状态验证的方法比一遍又一遍地编写if
和elseif
更干净...
也许您想按顺序检查每个字段,并且仅返回一个错误(如果发生)。
function error($message) {
exit('Error: ' . $message);
}
if ($field1 == "") { //You can also use if(empty(trim($field1)))
error('Empty field 1');
}
if ($field2 == "") {
error('Empty field 2');
}
if ($field3 == "") {
error('Empty field 3');
}
... //Do your magic
根据error
代码,可以使用自己的逻辑来代替error
函数中的exit()
。 希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.