【问题标题】:Covering all the bases with Form Validation, Client/Server - What is best way?使用表单验证、客户端/服务器覆盖所有基础 - 最好的方法是什么?
【发布时间】:2014-05-04 00:14:24
【问题描述】:

我知道在客户端和服务器端都有很多验证表单的方法,但我想知道最佳做法是什么?

目前,我有 Javascript 函数通过 onkeyup/onblur 函数“即时”验证表单输入字段,如下所示:

(部分代码:)

<p class="form-registerUserName">
    <div class="upperLabel">
        <label for="registerUserName">User Name</label>
        <span class="required">*</span>
    </div>
    <input
        id="registerUserName"
        name="registerUserName"
        type="text"
        size="24"
        maxlength="24"
        value="<?php echo $_SESSION['registerUserName'];?>"
        onkeyup="validateName()"
        onblur="checkDuplicateName(); validateName()"
    >
    <label for="registerUserName" class="hint" id="registerUserNameHint"></label>
</p>

使用 Javascript 函数,例如:

function validateName() {
    userName = document.getElementById("registerUserName").value.trim();
    re = /^[a-zA-Z0-9_]{1,30}$/;

    if (userName==="") {
        document.getElementById('registerUserName').style.borderColor="red";
        document.getElementById('registerUserNameHint').innerHTML = 'required';
    } else if (!re.test(userName)) {
        document.getElementById('registerUserName').style.borderColor="red";
        document.getElementById('registerUserNameHint').innerHTML = 'only alphanumeric characters and _';
    } else {
        document.getElementById("registerUserName").setAttribute("style","border-color: rgb(221,221,221) rgb(241,241,241) rgb(241,241,241) rgb(221,221,221);");
        document.getElementById('registerUserNameHint').innerHTML = '';
    }
} //validateName()

..这样输入框会变成红色,如果不验证的话会在框边显示提示。

所以我的问题是 - 当用户点击提交时,防止表单提交到我的 (Mysqli) 数据库的最佳方法是什么?

(和第二个问题..)在客户端验证清除后,我是否运行额外的 php 服务器端脚本?

我想实现这一点的一些方法是让我的 Javascript 函数设置一个 Session 变量来指示错误条件,如果有则不允许提交。

我不确定该怎么做,或者我如何将我的“提交”设置为不起作用,除非错误条件被清除。

不胜感激。

那么在插入到我的数据库之前,在成功的客户端验证之后,我是否再次使用 php 重新验证相同的数据(以相同的方式)?

提前致谢。

【问题讨论】:

  • 你永远不应该“信任”客户。客户端验证很容易被规避。 始终也在服务器上验证。客户端验证只是改善用户体验的一个很好的补充,但它永远不会取代适当的服务器端验证。
  • “在客户端验证清除后,我是否会运行一个额外的 php 服务器端脚本?” - 你当然会这样做,因为据你所知,is 没有客户端验证……如果您甚至假设一秒钟,到达您的服务器的任何请求都必须由“浏览器”之类的东西发送,您会基本上已经错误了。 (为什么-o-为什么我们必须一遍又一遍地说这个……?)
  • “当用户点击提交时,防止表单提交到我的 (Mysqli) 数据库的最佳方法是什么?” – 对提交做出反应事件,进行验证——然后在验证失败时取消事件(preventDefault)。当然,除了“新”之外,其他一切都已经被讨论过无数次了。
  • 感谢 cmets。我会仔细看看的。我确信其中一些事情已经讨论过了,但问题是找到那些特定的讨论。
  • 我是否应该使用会话变量来标记错误条件(如果 javascript 验证函数发现错误)以用于条件提交? .. 或者干脆跳过它,只在提交时进行服务器端验证?我想如果我无论如何都要进行服务器端验证,那将是多余的..

标签: javascript php forms validation


【解决方案1】:

首先,始终进行服务器端验证!

第二,HTML5表单验证得到很好的支持。
示例:http://html5pattern.com/

然后您可以使用 CSS 来验证样式。

【讨论】:

  • 好的,谢谢。但是关于我使用 Javascript 进行客户端验证的特殊情况的任何提示?特别是我正在尝试使用我的 javascript 函数设置错误条件,并且不允许在任何错误条件下提交。
【解决方案2】:

用这个逻辑来构建你的验证:

   if validateName() {
      document.getElementById("myForm").submit();
    }
    // if returns true (passed validation) then submit

//validate on click of submit button or on submit   
 function validateName() {
        userName = document.getElementById("registerUserName").value.trim();
        re = /^[a-zA-Z0-9_]{1,30}$/;

        if (userName==="") {
            document.getElementById('registerUserName').style.borderColor="red";
            document.getElementById('registerUserNameHint').innerHTML = 'required';
            **return false;**
        } else if (!re.test(userName)) {
            document.getElementById('registerUserName').style.borderColor="red";
            document.getElementById('registerUserNameHint').innerHTML = 'only alphanumeric characters and _';
            **return false;**
       ........ so forth
          else { 
             return true;
         }

【讨论】:

  • javascript 用于 99% 的浏览器中。所以除非你现在担心另外 1%,否则没关系
  • 如果你在乎 - 这里有一个链接让你开始:w3schools.com/php/php_form_validation.asp
  • 感谢这个想法。但是,验证函数在 onblur、onkeyup 事件期间运行。因此,对我来说,要调整提交,我必须在提交期间重新运行每个字段的所有验证功能。现在研究设置窗口对象/全局变量,因为带有 js 的会话变量需要 AJAX 或类似的东西。
  • 在这种情况下,您可以简单地将提交按钮设置为禁用,如果任何输入验证失败 onblur, onkeyup
  • 请记住“在提交期间重新运行每个字段的所有验证功能”会在一瞬间发生
猜你喜欢
  • 2012-05-04
  • 2011-10-17
  • 2010-09-09
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多