4

我正在开发一个 PHP 应用程序。它包含在 html 表单中。
我的问题是如何以一种简单的方式实现表单验证,而不需要在服务器(使用 PHP)和浏览器(使用 Javascript)上复制验证代码。
我设计了一种使用 ajax 的方法。当输入失去焦点(onblur 事件)时,它会使用它包含的数据对服务器进行 ajax 调用。如果值无效或为空字符串,则响应将是错误消息。但是代码在服务器和浏览器上都非常臃肿,并且可能非常错误。你能指出我正确的方向吗?输入验证总是那么复杂还是我应该使用不同的方法?非常感谢那些花时间阅读我的帖子的人,并感谢那些回答的人。

4

6 回答 6

1

我强烈推荐你Bassistance jQuery Validation 插件

始终与此一起实施强大的服务器端验证。

于 2012-06-04T16:26:27.400 回答
1

我只是将数据发布到通过 ajax 验证所有内容的 php 中。然后我在一个 json 字符串中返回错误,每个错误都有失败的输入的名称和一个错误字符串。使用 jQuery,我循环遍历 json 对象,并将输入读取并列出错误字符串。您可以让表单提交给这个脚本,这样如果关闭了 javascript,表单就会被检查相同的 php 脚本。

function submitForm() {
$.ajax({
  type: 'post',
  url: 'cgi-bin/s_contact.php',
  data: $("#contact").serialize(),
  dataType: 'json',
  success: function(data) {
      if(data.answer == 'true') {
        $("#showErrors").removeClass("progressbar");
         $("#showErrors").html('<h2>Message Has Been Sent!</h2>');
         setTimeout(function() {
             window.location = $("#zsite").val(); 
         },2000);
      }
      else {
          se = $("#showErrors");
          se.removeClass("progressbar");
          se.html('');
          se.append('<ul id="showeror"></ul>');
          $.each(data,function(index,val) {
            $('input[name='+index+']').css('background-color','#ff9');
            $('#showeror').append('<li>'+val+'</li>');
          });
      }
  },
  error: function(msg) {
        alert('Error: '+msg.error); 
  }
});

}

于 2012-06-04T16:29:23.990 回答
1

您总是需要服务器端验证。但是,您可以通过依赖第三方库在客户端让您的生活更轻松。

进行基本验证的最简单方法是使用 HTML5。这包括必填字段、数字范围和正则表达式检查等内容。不需要第三方库,不支持 HTML5 的浏览器只会忽略验证。这没问题,因为输入将在服务器上进行验证。

另一种方法是使用jQuery 验证扩展。使用这个库,您只需在表单字段中输出一些类。

如果您正在使用Zend_Form库来生成表单并进行验证,您可能已经看过这篇文章:http ://codeutopia.net/blog/2008/04/04/client-side-validation-with-zend_form/

于 2012-06-04T12:46:02.763 回答
1

如果您使用一个好的 javascript 验证插件,您会发现它们非常适合您的服务器端验证。我可能需要进一步解释这一点,所以请耐心等待。我会参考http://rickharrison.github.com/validate.js/来帮助我,但还有很多其他的。

就个人而言,我使用 Symfony 表单框架进行验证,但您可以使用其他框架或自行尝试。重要的是,您只需定义一组验证规则,这些规则又可用于驱动客户端验证。

这样您就不会在两个单独的验证过程之间出现任何不一致,从而确保您的应用程序是 DRY。此外,您的客户端验证可以与页面一起加载,因为这些规则已在您的服务器端代码中预定义,您不需要所有这些 ajax 请求。

如果您不熟悉任何 PHP 表单框架或我定义您的验证规则的意思,我可以让事情变得更清楚一些。

下面的数组可用于在服务器端循环两个 $_POST 字段,电子邮件和号码。这些信息也可以很容易地传递给客户端验证器(例如 json_encode($validators))。您可能需要稍微修改一下,这取决于客户端期望其规则的格式。但更重要的是,您的验证逻辑存储在一个地方。

$validators = array(
   'email' => array(
       'rules' => array(
           'blank' => false,
           'invalid' => '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i',
       ),
       'messages' => array(
           'blank' => 'Missing email',
           'invalid' => 'Invalid email',
       ),
    ),
    'number' => array(
       'rules' => array(
           'blank' => false,
           'invalid' => '/\d/',
       ),
       'messages' => array(
           'blank' => 'Missing number',
           'invalid' => 'Not a number'
       ),
     ......
于 2012-06-04T23:34:01.853 回答
1

输入验证非常复杂。您需要确保输入对您的数据类型完全有效。这通常包括每个项目的自定义验证。客户端和服务器端验证都没有替代品。

客户端验证提供了一个简洁的 ui。用户输入的每一件事都可以并且应该在客户端进行验证,这样就不必向服务器发出请求(减少延迟)。这并不意味着它可以替代服务器端验证,因为任何人都可以看到通过诸如 firebug 之类的工具发出的请求并将他们想要的任何数据提交到您的服务器。

在服务器端,您必须确保数据属于预期类型,否则您可能会面临 sql 注入或许多其他恶意攻击。

这实际上是一个很好的理由来查看许多 php mvc 框架中的任何一个。大多数包含表单助手,这将显着减少您为验证而编写的代码。

于 2012-06-04T12:39:34.040 回答
0

始终使用服务器端脚本来检查输入,因为如果您为此使用客户端(javascript),那么任何人都可以通过使用各种技术(如禁用 javascript 等)来愚弄您。

于 2012-06-04T12:42:23.313 回答