Php 这是否可以防止页面重新加载和“后退”按钮?

Php 这是否可以防止页面重新加载和“后退”按钮?,php,Php,除了我的计划,以下是我决定实施的计划;它可能不是纯粹的P-R-G,但似乎还可以。有什么评论吗 php有一个动作;让我们称之为validate.php 用户从未看到validate.php;如果验证所有$\u GET,如果valid将其写入数据库并生成确认页面的HTML/如果无效,则生成解释错误的错误页面的HTML 生成的HTML存储在$\u会话中变量中,然后进行验证。php执行头('Location:) 最后,一个名为submitted.php的invalid_input.php(如果用户读取U

除了我的计划,以下是我决定实施的计划;它可能不是纯粹的P-R-G,但似乎还可以。有什么评论吗

php有一个动作;让我们称之为validate.php

用户从未看到validate.php;如果验证所有
$\u GET
,如果valid将其写入数据库并生成确认页面的HTML/如果无效,则生成解释错误的错误页面的HTML

生成的HTML存储在
$\u会话中
变量中,然后进行验证。php执行
头('Location:)

最后,一个名为
submitted.php
invalid_input.php
(如果用户读取URL)页面只包含
echo$\u会话['form_html']

在我看来,这似乎是对页面重新加载和后退按钮问题的一种预防


或者我是不是因为试图重新发明轮子而一无所获?

只要在验证结束时使用php重定向,就不能重新加载或返回按钮到验证中。php

首先,最好存储表单数据,这意味着您可以再次执行验证。它也将减少html。您现在使用的方法的问题是它不能防止多个选项卡,因为
$\u SESSION
对于浏览器会话是通用的

我用来防止重复提交(没有PRG)的一种方法是为每个页面加载(涉及表单的地方)生成一个唯一的id。当我生成该唯一id时,我将其添加到
$\u会话['form\u unique\u ids']
数组中,并将其作为隐藏字段包含在我生成的每个表单中。然后,在对表单提交采取行动之前,我检查会话中是否存在唯一的id。如果是,这是该表单第一次提交,我将其从会话中删除。这样,如果我尝试重新提交该页面,我就会知道,因为该id不在不处理结果的会话中

可以对其进行扩展,这样就不用存储单个id,而是使用该id作为数组中的键,并让该值作为事务的结果。然后:

  • 如果有错误,您也会存储
    $\u POST
    数据。然后,重定向到
    original\u form.php?id=unique\u id
    ,并显示验证结果。您可以将它们存储或重新计算
  • 如果成功,则存储成功消息并重定向到
    success\u page.php?id=unique\u id
    。在显著位置显示成功消息。如果愿意,可以将其从页面中删除
  • 您可以选择在显示会话数据时删除它,但这意味着如果他们刷新编辑页面,他们将丢失验证消息和保存的表单数据。我更愿意找到一种方法来清除那些已经足够旧的数据,这样他们就不可能再需要这些数据了


    无论如何,这些想法中的一些可能是有用的。再说一次,也许这对解决这个问题来说太费劲了。您的呼叫:)

    这可能会起作用,但请确保您不依赖它来保护代码免受恶意用户的攻击。一般来说,你还需要后端级别的方法来防止重复提交。你应该使用POST请求,区别很重要。+1谢谢,两者都是(而且,呃,我使用的是POST,不是GET-baa,不知道我为什么写这个,他不好意思地说)+1谢谢,我喜欢你的建议(虽然我不知道你存储数据(在哪里?d/b或$U会话?)以再次验证它是什么意思(为什么再次验证?如果它有效一次且未更改…我错过了什么?)谢谢,shadow(比如,那个蒙面人是谁?)我自己在想,
    $U会话
    。存储数据占用的空间更少(因为存储html包括数据和周围的打印表单),更直接的方法是在要显示表单的页面上打印表单,而不是在其他地方。如果不想重新进行验证,只需将验证错误与
    $\u POST
    数据一起存储即可。理想情况下,您将能够使用与最初用于打印表单相同的打印代码(例如,如果是编辑表单)。+1但我为什么要存储数据?为什么不一次性验证数据并将其写入d/b?您应该仅在有错误时存储数据,在这种情况下,您无论如何都不想将其写入db。我认为如果有错误,则存储验证错误(因此您只需执行一次)在会话中可能比第二次验证要好。在这种情况下,您仍然需要存储
    $\u POST
    数据,以便您可以在重定向到的错误/编辑页面上填写表单。+1啊,明白了。是的,我将$\u POST移动到$\u会话id。如果有错误,请返回到输入表单并再次使用该数据,提示修复无效输入