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

Php 如何在最小化重复的同时使用客户端和服务器端验证?,php,javascript,ajax,validation,Php,Javascript,Ajax,Validation,我目前正在服务器端(PHP)验证用户输入。客户端发送XMLHttpRequest调用,并用红色边框标记无效字段。其他一切都很好,只是我认为客户提出请求的时间太长,然后发现他填错了东西。我认为我还应该放置一些JavaScript验证,这样客户端就不需要等待请求完成 但是,我不想重复验证规则和代码。是否有人在双方都实现了验证,以便您至少不需要重复验证规则 如果有必要的话,我正在jQuery中使用Yii和普通的老JavaScript 编辑:我还发现,客户端可能在计算机上的时间错误,使得基于JavaSc

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

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

如果有必要的话,我正在jQuery中使用Yii和普通的老JavaScript


编辑:我还发现,客户端可能在计算机上的时间错误,使得基于JavaScript的日期时间检查变得不好,这让人感到乏味。这意味着我需要首先从服务器向脚本提供正确的日期时间。

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


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

首先,我可以说永远不信任用户。。。用户可以更改java脚本。。。因此,需要进行服务器端验证

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

我认为你应该双管齐下。因为你不想浪费用户时间


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

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

我相信PEARs quick forms允许您同时为客户端和服务器端添加验证

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


似乎还有一个扩展可以为您执行此操作:

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

因此,您希望为每个验证编写一个代码

因此,请继续用php编写一个函数,用于电子邮件验证,比如:validate\u email()

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

一旦用户通过提交阶段,现在您就可以使用相同的函数验证电子邮件()来验证$\u帖子

这样您只需编写一个代码,维护起来就更容易了


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

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

在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):


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

不,还没有。但是我计划重用HTML5风格的
pattern=\w+
regexes客户端用于通知,服务器端用于过滤。可能会减少重复(给定一个非编程的php表单库)。这正是OP计划要做的。问题是如何做,这就是我现在正在做的,制作一个XHR并用红色边框标记无效字段。我看到的问题是,较长的请求会让它看起来愚蠢和不可用,因为用户必须等待请求完成。请参阅我对PeeHaa的评论。本地?在服务器上?一个简单的PHP表单验证请求应该几乎是即时的。如果您有一个低于标准的服务器,或者在验证之前正在执行大量的加载开销,那么这将带来一个问题。你的表单有多大?我需要的不仅仅是这些,比如确保日期在可接受的范围内。上面提到的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
    });
});