【问题标题】:Prevent user to use back button with warning or disable any insert防止用户使用带有警告的后退按钮或禁用任何插入
【发布时间】:2011-03-03 11:31:01
【问题描述】:

我在page1.php 中有一个表单,它指向page2.phppage1.php 中的表单中的数据从该表单插入到数据库中。成功插入后,page2.php 会显示一条消息并提供链接以转到第三页。

问题是当用户插入后点击浏览器的后退按钮并点击表单提交按钮时,再次插入。

有没有什么办法可以在一次插入后按下后退按钮时显示一条消息,显示不允许访问后退按钮?或者如果允许点击表单提交按钮时不会插入?

稍后编辑以添加此部分:

好的,让我详细介绍一下。它是关于管理后端的。管理员为不同的产品提供描述文本输入。他给出了 page1.php 的输入,并且 page2.php 上显示了描述已插入到 db 中的消息。然后在消息下方有另一个表格。它只是询问管理员是否希望对描述文本做更多的事情。如果是,然后单击表单提交按钮,他被带到一个页面,从那里穿过一些页面,他再次被带到 page1.php(这次是另一个产品),从那里到 page2.php 等等.顺便说一句,我可以使用普通页面链接而不是 page2.php 消息下方的表单按钮链接

问题是,当管理员在 page2.php 上并点击后退按钮时,他会回到 page1.php 并从那里如果他点击表单提交按钮,数据会第二次插入到新行。

你可能会建议使用'IGNORE'和'INSERT'命令,但是行中的其他列可能与另一列的列不匹配,而描述列(管理员为此列插入文本数据)可能会得到匹配。

1)忽略在这种情况下适用吗?

2)如果站点的数据库允许重复输入,应该如何解决?

谢谢

希望它能让整个事情变得清晰。

【问题讨论】:

    标签: php javascript html


    【解决方案1】:

    不要提供指向第三个页面的链接,而是重定向到相同的 URI
    这是一个非常方便的方法,称为POST/Redirect/GET:
    这是一个简洁的例子:

    <?php  
    if ($_SERVER['REQUEST_METHOD']=='POST') {  
    
      $err = array();
      //performing all validations and raising corresponding errors
      if (empty($_POST['name'])) $err[] = "Username field is required";  
      if (empty($_POST['text'])) $err[] = "Comments field is required";  
    
      if (!$err) {  
        //if no errors - saving data and redirect
        header("Location: ".$_SERVER['PHP_SELF']);
        exit;
      }  else {
        // all field values should be escaped according to HTML standard
        foreach ($_POST as $key => $val) {
          $form[$key] = htmlspecialchars($val);
        }
      }
    } else {
      $form['name'] = $form['comments'] = '';  
    }
    include 'form.tpl.php';
    ?>  
    

    这里你可以看到另一个例子,简洁而强大: Separating Logic/Style in PHP properly
    它是显示、添加和编辑数据库内容的完整解决方案,完全用于管理目的。

    【讨论】:

    • 当我发现“header”功能时,我很高兴。
    • @Col。弹片,我说的是物品插入。消息显示在 page2.php 上。在同一页面上,有一个表单提交按钮,询问用户是否有兴趣插入另一个项目。希望我已经向你说清楚了。我想你需要改变你的代码。顺便说一句“包括'form.tpl.php';”如何处理 .tpl.php 文件?
    • @sof_user 这完全取决于场景。正如你所说的那样,不可能肯定地回答。例如,您可以使用 SESSION 来防止这种情况,但并非适用于所有情况
    • @sof 不,这里什么都不清楚。如果您想要特定的答案,您必须提出特定的问题:这个表格是什么,这个数据是什么,那个用户是谁,他是否匿名以及是什么阻止他再次进入您的网站并从头开始填写表格。跨度>
    • @sof POST/Redirect/GET 是解决此问题的确切解决方案。如果您使用它,管理员将始终面临 EMPTY 表单,无法提交副本。就像我的代码中建议的那样,把它全部放在一个页面上
    【解决方案2】:

    您不应在page2.php 上显示您的消息。

    改为:

    • page2.php 应该处理数据
    • 保存数据后,page2.php 应该重定向到confirmation.php
    • 只有confirmation.php 会显示该消息。


    有关更多信息,请查看Post/Redirect/Get 模式。


    在评论后编辑: 但请注意,在任何情况下,如果用户真的想重新提交表单,您将永远无法阻止他...

    您将拥有的唯一解决方案是,在提交表单时,如果当前提交的数据已经存在,则检查您的数据库 - 如果存在,则拒绝再次插入。

    当然,如果用户在他的输入中改变了一个字母,它就不再是相同的数据了......

    【讨论】:

    • 如果用户在conformation.php中点击两次返回按钮会怎样?
    • 允许重复输入...现在该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2019-08-11
    • 2015-03-12
    • 2010-09-08
    • 2011-11-13
    • 2016-08-03
    相关资源
    最近更新 更多