我目前正在使用PHP构建表单管理器以验证大型表单。
我想知道什么是最好的结构,因为每次都会有不同的字段数。
我已经过滤该字段以使用前缀进行验证(例如:' user_name',将进行验证,但' name' no)。
我真正的问题是验证:我必须检查字段的类型(邮件,邮政编码,电话......) 并检查此类字段的值是否有效。
我认为我可以使用HTML5自定义数据" (例如:data-fieldtype =" zipcode"),但我不知道服务器无法获得此属性......
要走的路是什么?
我可以为每个字段使用2个输入,一个用于值,一个用于类型,但它看起来真的很愚蠢!
谢谢,如果你能提供帮助。
编辑:
你的答案都很有趣,我不知道哪个是最好的。 我可能会在您的解决方案之间进行混合,具体取决于表单的类型。
非常感谢。
答案 0 :(得分:1)
如果没有使用框架,您可以使用field =>数组。选项。
$rules = [
'user_name' => 'required',
'user_email' => 'email required',
// ...
];
然后将它们提供给一些验证器类,其中规则是方法,并且它们在动态内部调用验证方法:
class Validator {
public function __construct($data) { $this->data = $data; }
private function required($field) {}
private function email($email) {}
// etc
/** @method bool validate(array $rules) */
public function validate($rules) {}
}
答案 1 :(得分:1)
Methinks,这不应该在没有进一步考虑的情况下通过浏览器播放:恶意用户可以将“INT ONLY”字段操作为自由文本,并且您的应用程序突然不得不在字段中处理自由文本,被认为是一个整数(因此对SQL来说是安全的)。
您有两种方法:
两者都会使你的前缀技巧变得不必要,增加了可读性和可维护性。
答案 2 :(得分:1)
永远不会仅在客户端进行验证。始终验证服务器端。
通常,您将拥有控制器的基类,并且每个其他控制器都会扩展它。
一个好的方法是让每个视图控制器(或bootsrtap)都有一个方法check_params()。 它应该1)得到一个副本或$ _REQUEST,检查所需的每个参数,2)删除$ _REQUEST,3)写回检查和验证的参数。
abstract class controller_base {
public function __construct() { ...; $this->check_param();...}
protected final function check_param() {
foreach ($this->param_list() AS $name => $type) {...}
}
abstract public function param_list();
}
class controller_login extends controller_base {
public function param_list() {
return array('name' => 'string', 'password' => 'string');
}
}
这个想法就是这样你