在我的网站上,我有我的注册页面,用户输入他的信息以注册我的网站。
当他这样做时,我处理用户输入的信息。现在处理它时我正在使用数组来促进这个过程,而不是让我一遍又一遍地编写相同的代码。例如,以下是我如何收集用户信息并使用验证类中的方法进行检查。
$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);
}
但是我感到困难的是,如果输入的字段太长,如果在我通过的数组中我没有它所属的字段名称,如何返回它?我想到了一个多维数组,但我不确定它是否会起作用。
答案 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