0

我目前正在用 PHP 构建一个表单管理器来验证大型表单。

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

我已经通过使用前缀过滤要验证的字段(例如:'user_name',将被验证,但 'name' 没有)。

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

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

有什么办法?

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

谢谢,如果你能帮忙。

编辑 :

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

非常感谢。

4

3 回答 3

1

如果没有使用框架,您可以使用字段 => 选项的数组。

$rules = [
            'user_name' => 'required',
            'user_email' => 'email required',
           // ...
         ];

然后将它们提供给一些验证器类,其中规则是方法,并且它们在 validate 方法中被动态调用:

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) {}

}
于 2013-06-12T09:57:04.443 回答
1

我认为,这不应该在没有进一步考虑的情况下通过浏览器播放:恶意用户将能够将“INT ONLY”字段操纵为自由文本,并且您的应用程序将突然不得不处理字段中的自由文本,这被认为是被验证为整数(因此例如对 SQL 来说是安全的)。

你有两种方法:

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

两者都会使您的前缀技巧变得不必要,从而提高可读性和可维护性。

于 2013-06-12T09:57:18.083 回答
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');
    }
}

这个想法是这样你

  • 仅使用已清理的参数
  • 你自动删除每个不需要的参数
  • 您在每个控制器中都有一个列表,说明使用的参数。
于 2013-06-12T09:57:44.200 回答