避免凌乱的验证码

时间:2017-12-01 10:11:14

标签: php

我目前正在为我的网站制作一个简单的登录/注册系统,而且我对我的部分代码不太满意。

我有一个脚本,用于检查注册表单中的任何字段是否为空,并给出正确的响应,例如,如果您忘记输入名字,它会告诉您"名字不能为空& #34;

我的问题是我的代码目前看起来像这样:

if(field1 != ""){
  if(field2 != ""){
    if(field3 !=""){
      //register user
    }else{
      //field3 empty error
    }
  }else{
  //field2 empty error
  }
}else{
//field1 empty error
}

是否有更清洁,更有效的方法,这仍然可以让我准确显示哪些字段是空的?

6 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

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

答案 1 :(得分:1)

您可以将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
   }
}

答案 2 :(得分:0)

您可以使用 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.
}

答案 3 :(得分:0)

这样的风格怎么样:

$aErrors = array();

if(field1 == "") {
    $aErrors[] = 'error 1';
}
if(field2 == "") {
    $aErrors[] = 'error 2';
}
if(field3 == "") {
    $aErrors[] = 'error 3';
}

if(empty($aErrors)) register();
else print_errors();

答案 4 :(得分:0)

在单独的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);
        }
    }
}

使用这种在线状态验证比一遍又一遍地写ifelseif要清晰得多......

答案 5 :(得分:0)

也许您希望按顺序检查每个字段,如果发生错误,则只返回一个错误。

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

而不是exit()函数中的error,您可以使用自己的逻辑,具体取决于代码。希望这有帮助