代码之家  ›  专栏  ›  技术社区  ›  Tower

如何在最小化重复的同时使用客户端和服务器端验证?

  •  4
  • Tower  · 技术社区  · 15 年前

    我目前正在服务器端(PHP)验证用户输入。客户端发送XMLHttpRequest调用并用红色边框标记无效字段。其他的一切都很好,除了我认为客户提出请求并注意到他填错了东西太久。我认为我也应该放置一些JavaScript验证,这样客户机就不需要等待请求完成。

    但是,我不想复制验证规则和代码。是否有人在双方都实现了验证,以便您至少不需要重复验证规则?

    如果这很重要的话,我将使用yii和普通的旧javascript和jquery。

    编辑:我还发现客户机在他的计算机上可能有错误的时间,这使得基于javascript的日期时间检查很糟糕,这很乏味。这意味着我需要首先给出从服务器到脚本的正确日期时间。

    6 回复  |  直到 15 年前
        1
  •  1
  •   linead    15 年前

    我相信Pears快速表单允许您同时为客户端和服务器端添加验证。

    由于您使用的是yii框架,并且yii提供了一个相当健壮的验证方案,所以我将研究如何扩展表单生成框架以检查验证程序的字段,然后将每个验证类映射到一个JS函数,您应该能够非常快地编写它。

    似乎还有一个扩展可以为您做到这一点: http://www.yiiframework.com/extension/jformvalidate/

        2
  •  2
  •   PeeHaa    15 年前

    创建一个验证字段并以通用方式设置的函数i php。所以您可以在服务器端和客户机端都使用它。

    对于客户端,使用jquery对php验证函数进行一些Ajax调用。

        3
  •  1
  •   Haluk    15 年前

    绝对不要将客户端日期时间检查用于任何目的。你说得对。

    所以您要为每个验证编写一个代码。

    所以继续用PHP编写一个函数来进行电子邮件验证,比如: 验证电子邮件() .

    一旦用户按下Submit,就可以使用Ajax将所有数据发送到PHP代码,并对其进行验证。

    一旦用户通过提交阶段,现在您可以使用相同的功能 验证电子邮件() 验证$_日志。

    这样,您就可以编写一个代码,并且更容易维护。

    这比JavaScript慢吗?很难说。记住,添加一个额外的jquery验证插件也会加载到页面上。 Here is a popular validation plugin 对于jquery,它的小型版本是25KB。现在您的代码是整洁的,并且易于维护。如果这是一个主页,并且假设您选择使用一个插件,那么您只需在可能最有价值的登录页上保存25kb的负载。

        4
  •  0
  •   bmb    15 年前

    如果您的验证规则可以用正则表达式来描述,那么您可以在一个地方定义它们,并在您的PHP代码中使用您在生成的javascript中使用的相同regex。

        5
  •  0
  •   methodin    15 年前

    一些伪代码作为一种可能的方法:

    在php中:

    function validate() {
        // Use $_POST to validate whatever items in whatever fashion you want
        // and echo a message or some JSON array etc...
    }
    

    在javascript中(假设jquery):

    $('#formButton').click(function(event){
        event.preventDefault();
        $.post('/url/of/page', $(this).serializeArray(), function(response){
            // Assuming JSON data, but could just be a string or message,
            // check for response.success or whatever from validation
            if(response.success) $('#form').submit();
            else // Some error message or action
        });
    });
    

    虽然Ajax调用中可能会有一些开销,但这允许您使用任何您想要的验证方法,并保持代码完全相同,无论是来自实际的POST还是通过Ajax。不过,从PHP的一个$后迭代得到的一个简单响应并没有那么多开销。这还允许您在需要的时候运行查询——当然,您希望保持查询的简单性,因为所有操作都会运行两次。

        6
  •  -1
  •   Mohammad Efazati    15 年前

    一开始我可以说永远不要相信用户…用户可以更改Java脚本…因此需要服务器端验证

    第二:为什么要使用客户端验证?为了速度。

    我认为你应该双向使用。因为你不想浪费用户时间

    使用JS验证并发送数据。在管理员中,如果存在错误的数据,请退出用户。