【问题标题】:easy way to do HTML form validation with PHP and javascript使用 PHP 和 javascript 进行 HTML 表单验证的简单方法
【发布时间】:2012-06-08 12:41:18
【问题描述】:

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

【问题讨论】:

  • 在浏览器和服务器上验证总是好的...
  • 客户端是为了让用户满意并限制来自传入数据的漏洞,而服务器验证是为了最大限度地降低数据处理的安全风险。

标签: php javascript ajax validation


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我强烈推荐你Bassistance jQuery Validation plugin

      始终同时实现强大的服务器端验证。

      【讨论】:

        【解决方案4】:

        我只是将数据发布到通过 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); 
          }
        });
        

        }

        【讨论】:

          【解决方案5】:

          如果您使用一个好的 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'
                 ),
               ......
          

          【讨论】:

          • 好的,但是如果我必须针对数据库中的数据进行验证怎么办?客户端验证无法做到这一点。
          • 在数据结构中定义验证规则并在此基础上生成 javascript 代码和 php 代码的好主意。
          • 那些天我忙于研究 Yii 框架——以前从未使用过框架,也没有使用过面向对象的方法。无论如何,那里有一些验证类,但我还没有到达那些章节。
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-23
            • 1970-01-01
            • 2010-12-16
            • 2015-04-26
            • 1970-01-01
            • 2021-12-29
            相关资源
            最近更新 更多