Php 这是否可以防止页面重新加载和“后退”按钮?
除了我的计划,以下是我决定实施的计划;它可能不是纯粹的P-R-G,但似乎还可以。有什么评论吗 php有一个动作;让我们称之为validate.php 用户从未看到validate.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
$\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。如果有错误,请返回到输入表单并再次使用该数据,提示修复无效输入