PHP在验证类中使用数组

时间:2011-01-01 19:15:14

标签: php oop validation

在我的网站上,我有我的注册页面,用户输入他的信息以注册我的网站。

当他这样做时,我处理用户输入的信息。现在处理它时我正在使用数组来促进这个过程,而不是让我一遍又一遍地编写相同的代码。例如,以下是我如何收集用户信息并使用验证类中的方法进行检查。

$data = array(
   $_POST['firstname'] => "First Name",
   $_POST['lastname'] => "Last Name"
);

foreach($data as $userInput => $fieldName) {
   $validation = new Validation();
   $result = $validation->checkEmpty($userInput, $fieldName);
}

现在这一切都在我的页面上工作,我能够检查用户是否在方法“checkEmpty”上留下了一些空的东西,这也返回了一个空的数组。我没有显示该方法,因为它不是我的问题的一部分。现在,这是我的问题,我还要检查字段的长度。如果不重写一遍又一遍,我会做一个好方法吗?我还需要做另一个阵列吗?

我在想这样的事,也许?

$data2 = array(
  $_POST['firstname'] => 30,
  $_POST['lastname'] => 35
),

foreach($data as $userInput => $limit) {
   $result = $validation->checkLength($userInput, $limit);
}

但是我感到困难的是,如果输入的字段太长,如果在我通过的数组中我没有它所属的字段名称,如何返回它?我想到了一个多维数组,但我不确定它是否会起作用。

4 个答案:

答案 0 :(得分:1)

我会完全不同地构造数组,例如:

$config = array(
   'firstname' => array('notEmpty' = true,
                        'limit' => 30),
   'lastname' => array('notEmpty' = true,
                       'limit' => 35)
);

然后我会创建一个如下所示的方法validate

public function validate($config, $data) {
    $error = array();
    foreach($data as $field => $value) {
        $c = $config[$field];
        if(array_key_exists('notEmpty', $c)) {
            if(!$this->checkEmpty($value)) {
                $this->addError($error, $field, 'Must not be empty');
            }
        }
        if(array_key_exists('limit', $c)) {
            if(!$this->checkLength($value, $c['limit'])) {
                $this->addError($error, $field, 'Must not be longer than' . $c['limit'] . ' characters');
            }
        }
        /*...*/
    }
    return $error;
}

private function addError(&$error, $field, $msg) {
    if(!array_key_exists($field, $error)) {
        $error[$field] = array();
    }
    $error[$field][] = $msg;
}

然后你打电话:

$validation = new Validation();
$errors = $validation->validate($config, $_POST);

$errors将包含每个字段的所有错误消息。你只需要循环它们并在字段旁边打印它们。

当然这段代码可以(而且应该是!)得到改进。例如。动态查找验证方法)。


那就是说,我强烈建议您查看并使用现成的验证类,例如Zend_Validate

答案 1 :(得分:0)

我认为使用字段名称作为数组的键可能是更好的方法。然后是的,使用像这样的多维数组。

$data = array(
   'First Name' => array($_POST['firstname'], 30),
   'Last Name' => array($_POST['lastname'], 35)
)

答案 2 :(得分:0)

你掩饰了验证课,但我认为它很重要。例如,如果它没有任何状态,它应该静态使用。没有理由像每次循环迭代那样构建它!

 Validation::checkEmpty($x);

AS用于长度检查,id建议您在验证中保留字段

 protected $lengths = array( 'firstname' => 35, 'lastname' => 30, 'default' => 100);

并用

调用它
 Validation::checkLength($userInput, $fieldName);

有一个像

这样的身体
 protected static function checkLength($subject, $fieldType = 'default')
 {
        return strlen($subject) < self::$lengthTypes($fieldType);
        //or self::$fields['lengthLimit'] if you are going to structure it like Felix suggest
 }

你不需要我告诉你一个函数lengthChecker($subject, $limit)是毫无意义的。

编辑 - 菲利克斯建议的重组并不是一个糟糕的主意,取决于你想要多远这个。他的外表更具伸展性。如果您要实现addError,您可能不需要静态设计。

答案 3 :(得分:0)

通过查看一些框架验证机制,您也可以获得一些灵感。例如CakePHP非常容易使用: CakePHP Multiple Rules per Field