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

时间:2010-11-27 16:39:56

标签: php javascript ajax validation

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

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

如果重要的话,我正在使用Yii和普通的JavaScript和jQuery。

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

由于您正在使用Yii框架并且Yii提供了相当强大的验证方案,我将看一下扩展表单生成框架以检查验证器字段的某种方式,然后将每个验证类映射到js函数你应该能够很快写出来。

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

答案 2 :(得分:1)

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

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

所以继续编写php中的函数进行电子邮件验证,假设: validate_email()

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

用户现在通过提交阶段后,您可以使用相同的功能 validate_email()来验证$ _POST。

通过这种方式,您可以编写一个代码,并且更易于维护。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

在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迭代的简单响应并没有那么多开销。这也允许您在需要时运行查询 - 当然,您希望保持简单,因为一切都会运行两次。

答案 5 :(得分:-1)

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

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

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

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