Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和JS中表单验证的最佳方法_Php_Javascript_Forms_Validation - Fatal编程技术网

PHP和JS中表单验证的最佳方法

PHP和JS中表单验证的最佳方法,php,javascript,forms,validation,Php,Javascript,Forms,Validation,我想知道什么是实体表单验证的最佳方法 JavaScript做得很好,但它不是可靠验证的基础,因为它可以被操纵甚至禁用 如果使用PHP检查数据,并在发生错误时重新填充表单,则post表单会出现几个问题 如果表单在没有重定向的情况下显示,那么如果用户想要重新发送数据,F5将显示一个确认框,这并不漂亮 如果用户再次被重定向到表单,则必须通过GET或POST提交数据。使用POST,如上所述,F5问题再次出现。使用GET,传输内部带有&的值时存在问题(PHP猜测符号后面的另一个参数) 第三种方法是将数据

我想知道什么是实体表单验证的最佳方法

JavaScript做得很好,但它不是可靠验证的基础,因为它可以被操纵甚至禁用

如果使用PHP检查数据,并在发生错误时重新填充表单,则post表单会出现几个问题

  • 如果表单在没有重定向的情况下显示,那么如果用户想要重新发送数据,F5将显示一个确认框,这并不漂亮
  • 如果用户再次被重定向到表单,则必须通过
    GET
    POST
    提交数据。使用
    POST
    ,如上所述,F5问题再次出现。使用
    GET
    ,传输内部带有
    &
    的值时存在问题(PHP猜测符号后面的另一个参数)
  • 第三种方法是将数据存储在数据库中,例如SUBMITTRIALS或类似的东西。但实际上,在重定向之后,您必须清除数据
重新填充表单本身会带来另一个问题:类似这样的代码:

echo "<input type='text' value='".$val."' />";
  <form id="commentform" action="/index/addcomment" method="POST">

    <p>
      <input type="text" name="Name" id="name" value="" size="22" class="required" minlength="3">
      <label for="name"><em>*</em><?= _("Name") ?></label>
    </p>

    <p>
      <input type="text" name="EMail" id="email" value="" size="22" class="required email">
      <label for="email"><em>*</em><?= _("EMail") ?> <?= _("(will not be published)") ?></label>
    </p>

    <p>
      <input type="text" name="Url" id="url" value="" size="22">
      <label for="url"><?= _("Website") ?></label>
    </p>

    <p>
      <textarea name="Content" id="comment" cols="100%" rows="10" class="required" minlength="5"></textarea>
    </p>

    <p>
      <input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment">
      <input type="hidden" name="BlogId" value="<?= $this->model->BlogId ?>" />
    </p>

  </form>
echo”“;
如果变量
$val
包含包含撇号的值,则会生成无效的HTML


正如您所看到的,表单验证场景中有很多失败的可能性。如上图所述,处理表单验证的最可靠方法是什么?

我使用的是jquery表单验证程序,它工作得非常好

在您的头标签中:

<script language="javascript" type="text/javascript" src="/media/js/jquery-latest.js"></script>

<script language="javascript" type="text/javascript" src="/media/js/jquery.validate.min.js"></script>
<script>
  $(document).ready(function(){
    $( "#commentform" ).validate();
  });
</script>

$(文档).ready(函数(){
$(“#commentform”).validate();
});
然后用这样的形式:

echo "<input type='text' value='".$val."' />";
  <form id="commentform" action="/index/addcomment" method="POST">

    <p>
      <input type="text" name="Name" id="name" value="" size="22" class="required" minlength="3">
      <label for="name"><em>*</em><?= _("Name") ?></label>
    </p>

    <p>
      <input type="text" name="EMail" id="email" value="" size="22" class="required email">
      <label for="email"><em>*</em><?= _("EMail") ?> <?= _("(will not be published)") ?></label>
    </p>

    <p>
      <input type="text" name="Url" id="url" value="" size="22">
      <label for="url"><?= _("Website") ?></label>
    </p>

    <p>
      <textarea name="Content" id="comment" cols="100%" rows="10" class="required" minlength="5"></textarea>
    </p>

    <p>
      <input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment">
      <input type="hidden" name="BlogId" value="<?= $this->model->BlogId ?>" />
    </p>

  </form>


*

*


你的三个要点,一个接一个:

  • 是的,这是正确的,不,它不是很优雅。但正如你所说:重定向解决了这个问题。所以重定向
  • 否,将与符号转换为
    &不应构成问题
  • 为什么要使用数据库来存储这样的数据?会话有什么问题?或者,如果需要的话:一块饼干
  • 在resuming:redirect中,为了避免出现确认框,如果您需要在服务器端存储一些已提交的数据,并将符号转换为它们的html实体,并且您都已设置好,请使用会话
    转换
    &
    可以这样实现:

    var tmpDiv = document.createElement('div');
    tmpDiv.innerText = '&';
    var entity = tmpDiv.innerHTML;//returns &amp;
    

    我有一些解决办法给你

  • 您需要将用户重定向到同一页面并释放post数据

    header("Location: samefile.php?success=true");//or ?errors[]=blabla
    exit();
    
    if(isset($_GET['success']) && $_GET['success'] == true){
        //handle true
    }else if(/* here you can ask about errors or what ever */){
    
    }
    
    这样可以避免刷新时重新发送数据

  • 使用$\u会话存储数据,而不是数据库


  • 如果我错了,请更正。

    服务器端语言是验证表单的唯一方法。出于同样的目的,您可以将表单数据存储在会话或cookie中。验证完成后,可以刷新它们。如果数据中的引号有问题,那么可以使用PHP内置函数
    addslashes()
    stripslashes()
    来避免它们。

    您通常会使用
    htmlspecialchars(…)
    而不是直接回显$val。这将是一个巨大的XSS问题!此外,您不能使用数据库,只能使用会话!你很好地概括了这些问题。没有银弹,这些问题中的每一个都必须单独处理:您可以用HTML编码您的变量以避免撇号问题;您可以尝试将一些验证信息从服务器传递到客户机,以便在这两个地方使用相同的验证规则,但这永远不会是整洁的。我认为你永远也无法回避POST问题——这只是HTTP的工作方式。记住HTML5表单提供了浏览器中的内置验证。如果这对您来说已经足够了,您只需正确设置字段类型,让浏览器处理客户端,然后只需关注服务器端验证。使您的工作更轻松。@RobinWinslow这是一个很好的方法,但如果用户犯了错误,则必须正确沟通,可能需要一些帮助和本地化文本。因此,我想创建自己的方式来显示错误(红色文本、红色边框、警报框等)。HTML5对于一些小表单来说做得很好,但是对于更大的表单,你应该自己处理。@Florian:这取决于整个架构。在默认情况下,你是对的。但在最坏的情况下:如果架构不好,您可以重定向会话id(当然,您必须在受害者端进行一些其他破解,但这可以通过漏洞攻击实现),然后执行XSS。顺便说一下,你也应该考虑<代码>我认为OP知道这种解决方案。他提到这种方法的缺点是没有在服务器端进行验证。看起来他在寻找服务器+客户端解决方案。@RobinWinslow没错。客户端验证没有问题,我通常倾向于完全靠自己来实现。啊。。好啊我将$u POST变量放在模型中,然后将模型发布回表单。在将某些内容放入数据库时,我使用参数绑定。有时与打字结合使用。当然,我的业务规则也适用于该模型。此外,该线程没有使用jQuery标记,请只发布纯JS答案。好吧,如果jQuery证明了上述问题的解决方案,那么jQuery答案是非常受欢迎的;)嗯,这实际上是一个解决办法,不是吗?我知道JavaScript函数encode()和PHPs urlencode(),它们也是
    GET
    的一个很好的解决方案-参数javascripts
    encodeURI
    不会将符号转换为html实体,因为它被认为是有效的,当然……您每次将文件加载到自身时都会重定向吗?这是一个无限循环。。。但是在会话中存储数据实际上是一种很好的方法。坏的可能性只是重新填充表单的点,如@androidavid m