大表格验证结构

时间:2013-06-12 09:44:50

标签: php forms validation

我目前正在使用PHP构建表单管理器以验证大型表单。

我想知道什么是最好的结构,因为每次都会有不同的字段数。

我已经过滤该字段以使用前缀进行验证(例如:' user_name',将进行验证,但' name' no)。

我真正的问题是验证:我必须检查字段的类型(邮件,邮政编码,电话......) 并检查此类字段的值是否有效。

我认为我可以使用HTML5自定义数据" (例如:data-fieldtype =" zipcode"),但我不知道服务器无法获得此属性......

要走的路是什么?

我可以为每个字段使用2个输入,一个用于值,一个用于类型,但它看起来真的很愚蠢!

谢谢,如果你能提供帮助。

编辑:

你的答案都很有趣,我不知道哪个是最好的。 我可能会在您的解决方案之间进行混合,具体取决于表单的类型。

非常感谢。

3 个答案:

答案 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来说是安全的)。

您有两种方法:

  • 将表单验证结构存储在DB中,并提交一个隐藏字段,其中包含验证结构的ID。收到请求后,您的脚本将从DB请求结构,对其进行反序列化并对其进行处理。
  • 如果您确实需要浏览浏览器,请序列化验证结构,对其进行base64编码并将其用作单个隐藏字段。由于上述原因,必须对此值进行身份验证,要么进行哈希处理(与服务器只知道的另一个字符串连接,哈希,将哈希作为第二个隐藏字段发送,在下一个请求中验证哈希是否正确)或者加密(在浏览器往返之前加密序列化数据,之后解密,只知道服务器的密钥)

两者都会使你的前缀技巧变得不必要,增加了可读性和可维护性。

答案 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');
    }
}

这个想法就是这样你

  • 仅使用已消毒的参数
  • 您自动删除所有不需要的参数
  • 每个控制器都有一个列表,列出了使用的参数。