0

在 PHP 中简单地使用一长串嵌套的 if / else 语句来验证来自 HTML 表单的用户输入是否有效?

所以说有两个领域,我只是这样接近它:

if ( field one is formatted right ) {
   if ( field one is long enough ) {
           if ( field two is ok ) {
               do stuff;
           }
           else {
               echo "field two is not ok!";
           }
   }
    else {
        echo "field one is not long enough!";
    }
}
else {
 echo "field one is not formatted right!";
}

我希望你能明白。

因此,当有多个字段和大量验证要做,并且每个字段的验证类型不同时,这最终会很长。

这是处理这个问题的坏方法吗?

4

5 回答 5

3

我通常做的是这样的:

$error_msg = '';
if (field1 not valid)
    $error_msg .= 'Field One is not valid.<br>';

if (field2 not valid)
    $error_msg .= 'Field two is not valid.<br>';

if ($error_msg == '')
{
    // DO ALL YOUR VALID SUBMISSION STUFF HERE
}

我通常认为最好一次通知用户所有错误,而不是一次通知一个来惹恼他们。

于 2013-02-28T15:36:35.930 回答
1

该代码应该可以工作,确定其效率的一种方法是使用分析来实际测量它需要多长时间。

另一种验证方法是这样的:

function handle_submission(){
   $field_1_validation_result=validate_field_1_value($field_1_value);
   if($field_1_validation_result!==true)exit($field_1_validation_result);

   $field_2_validation_result=field_2_validation_result($field_2_value);
   if($field_2_validation_result!==true)exit($field_2_validation_result);

   //Everything is right
   do stuff
}

function validate_field_1_value($value){
   if ( !field one is formatted right )return "field one is not formatted right";
   if ( !field one is long enough )return "field one is not long enough";
   return true;
}



function validate_field_2_value($value){
   if( !field two is ok)return "field two is not ok"
   return true;
}
于 2013-02-28T15:40:17.827 回答
1

向前思考肯定有更好的方法可以解决这个问题。首先,您可以尝试使用预定义的验证方法创建类似验证类的东西。

举一个(一个非常粗略的)例子:

class Validator {

    public function validate($args) {
        $errors = array();
        //Make sure to do any santising you need too
        foreach($args as $field=>$data) {
            if ($response = $field($data))
                $errors[$field] = $response; 

            //You could create break code here if you wanted 
            //to check if the form was invalid without detailed feedback
        }
        if (empty($errors)) {
            return false;
        }
        return $errors;
    }

    private function email_field($data) {
        $valid = true;

        //perform a validation on email here, generate an $err_msg if it's not valid

        if ($valid) 
            return false;

        return $err_msg
    }
}

$validator = new Validator();

//You probably want to explode or loop through the error messages
//Or for extra brownie points, use the key of each element in the array to place
//the error message intelligently within your HTML!
$validation_errs = $validator->validate($_POST);
if ($validation_errs) 
    print_r($validation_errs);

结合你的表格...

<form method="post" action="">
    <input type="text" name="email_field" />
</form>

然后可以将其组合起来以提供您的验证。这可能更好的原因是您可以在整个站点中使用此类,这意味着您不必复制验证逻辑,更重要的是,您不必为每个表单都有嵌套逻辑的踪迹。您只需传递 post 变量,您的类将自动运行它需要的验证,并返回一个完全清除(不直观,这里是“假”,抱歉)或与它们来的字段名称配对的验证错误消息数组从。

此外,这在处理结合服务器端和客户端验证时变得很有用,允许您使用 AJAX 通过 AJAX 调用非常具体的、单个字段的验证查询到您的 PHP 并返回可以使用的响应(只要您在做您的输出足以确保它对 AJAX 通信有效)。

所以,当谈到效率时,不仅仅是现在什么是重要的,或者性能差异可能有多么微不足道......它是关于它会在以后为你节省多少时间,当你的表单发生变化时,当你的验证逻辑必须被更改,并且当您需要一遍又一遍地重用相同的验证逻辑时。

于 2013-02-28T15:54:14.710 回答
0

我认为这样的格式更容易阅读和遵循:

if ( field one is not formatted right ) {
    echo "field one is not formatted right!"

} else if ( field one is no long enough ) {
    echo "field one is not long enough!";

} else if ( field two is not ok) {
    echo "field two is not ok!";

} else  {
    do stuff;
}
于 2013-02-28T15:40:57.070 回答
0

这是我大多数时候做的事情:

$Errors = array();

if (field one is not formatted right)
    $Errors[] = "Field one is not formatted right.";

if (field one is not long enough)
    $Errors[] = "Field one is not long enough.";

if (field two is not ok)
    $Errors[] = "Field two is not ok.";

if (empty($Errors)) {
    do stuff;
} else {
    foreach ($Errors as $Error) {
        echo '<div class="error">' . $Error . '</div>';
    }
}

这类似于其他答案,只是我使用数组来存储错误消息,以便我可以更轻松地格式化它们。

于 2013-02-28T15:47:43.470 回答