【问题标题】:How can I use client and server-side validation while minimizing duplication?如何在最大限度减少重复的同时使用客户端和服务器端验证?
【发布时间】:2011-05-16 14:43:14
【问题描述】:

我目前正在服务器端 (PHP) 验证用户输入。客户端发送 XMLHttpRequest 调用并用红色边框标记无效字段。其他一切都很好,除了我认为客户提出请求然后注意到他填写了错误的内容需要很长时间。我想我也应该放置一些 JavaScript 验证,以便客户端不需要等待请求完成。

但是,我不想重复验证规则和代码。有没有人在两边都实现了验证,这样你至少不需要重复验证规则?

如果重要的话,我正在使用 Yii 和带有 jQ​​uery 的普通旧 JavaScript。

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

【问题讨论】:

  • 不,目前还没有。但我计划重用 HTML5 风格的 pattern=\w+ 正则表达式客户端用于通知和服务器端进行过滤。可能会减少重复(给定一个非编程的 php 表单库)。

标签: php javascript ajax validation


【解决方案1】:

在 PHP 中创建一个函数来验证字段并以通用方式设置它。因此,您可以在服务器端和客户端使用它。

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

【讨论】:

  • 这就是我现在正在做的事情,制作 XHR 并用红色边框标记无效字段。我看到的问题是更长的请求使它看起来很愚蠢且无法使用,因为用户必须等待请求完成。
【解决方案2】:

起初我可以说永远不要信任用户...用户可以更改 java 脚本...所以需要服务器端验证

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

我认为你应该同时使用这两种方式。因为你不想浪费用户时间

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

【讨论】:

  • 这正是 OP 计划做的事情。问题是如何去做。
【解决方案3】:

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

【讨论】:

  • 我还需要更多,比如确保日期在可接受的范围内。
【解决方案4】:

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

由于您使用的是 Yii 框架并且 Yii 提供了一个相当健壮的验证方案,我将研究一些扩展表单生成框架以检查验证器字段的方法,然后将每个验证类映射到一个 js 函数你应该能够很快地写出来。

似乎还有一个扩展程序可以为您执行此操作:http://www.yiiframework.com/extension/jformvalidate/

【讨论】:

    【解决方案5】:

    绝对不要出于任何目的使用客户端日期时间检查。你是对的。

    所以你想为每个验证编写一个代码。

    所以继续在 php 中编写一个进行电子邮件验证的函数,比如说:validate_email()

    一旦用户按下提交,您就可以使用 ajax 将所有数据发送到 php 代码并对其进行验证。

    一旦用户通过了提交阶段,您现在可以使用相同的函数 validate_email() 来验证 $_POST。

    这样你写一个代码,更容易维护。

    这比 javascript 慢吗?很难说。请记住,放置一个额外的 jquery 验证插件也会在页面上加载。 Here is a popular validation plugin 对于 jquery,它的缩小版是 25KB。现在您的代码更整洁且更易于维护。如果这是一个主页,并且假设您选择使用插件,那么您可能为您可能最有价值的目标网页节省了 25KB 的负载。

    【讨论】:

    • 提到的jQuery验证插件很棒。非常易于使用,易于使用自定义规则进行扩展。
    【解决方案6】:

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

    在 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 的 $_POST 迭代的简单响应并没有太多开销。如果需要,这还允许您运行查询 - 当然,您希望使它们保持简单,因为一切都会运行两次。

    【讨论】:

    • 请看我对 PeeHaa 的评论。
    • 本地?在服务器上?一个简单的表单验证 PHP 请求应该是即时的。如果您有一个低于标准的服务器,或者在验证之前正在做大量的加载开销,这会带来问题。你的表格有多大?
    猜你喜欢
    • 2010-10-25
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多