没有回头路,如果用户点击刷新,停止PHP重做一切?

没有回头路,如果用户点击刷新,停止PHP重做一切?,php,forms,refresh,Php,Forms,Refresh,我是初级PHP开发人员,目前正在制作报价表,该表将记录客户详细信息以及员工在报价表中输入的内容,并将: 将客户和报价详细信息保存到数据库 生成PDF(使用mpdf库) 通过电子邮件将pdf发送给客户 目前它只有两个文件index.php和quote.php 这是一张图表 正如您所看到的,它是一个单片架构(我将所有操作都放在一个PHP文件中) 这会造成问题,因为当用户点击“SUBMIT”并quote.php执行其所有功能时,用户会被卡在该页面上。然后,如果他们点击刷新,quote.php将再

我是初级PHP开发人员,目前正在制作报价表,该表将记录客户详细信息以及员工在报价表中输入的内容,并将:

  • 将客户和报价详细信息保存到数据库
  • 生成PDF(使用mpdf库)
  • 通过电子邮件将pdf发送给客户
目前它只有两个文件index.phpquote.php

这是一张图表

正如您所看到的,它是一个单片架构(我将所有操作都放在一个PHP文件中)

这会造成问题,因为当用户点击“SUBMIT”并quote.php执行其所有功能时,用户会被卡在该页面上。然后,如果他们点击刷新,quote.php将再次被执行,并最终对我的数据库表和电子邮件收件箱进行垃圾邮件处理

我想知道什么是防止用户重新执行或返回到只应执行一次的操作的最佳方法

我有几个主意,希望你能给我推荐你的

  • 想法1:一个阻止重复执行相同代码的会话变量

  • 想法2:将quote.php文件分解为单独的文件,然后从每个文件跳转。(这可能吗)

我想以最好的方式做到这一点,我愿意接受任何建议

谢谢你抽出时间


:)

你想做的事叫做PRG或。成功的POST请求后,您可以通过
位置
标题重定向到另一个页面。此页面将仅显示某些内容(例如状态消息),但不执行任何操作。然后点击F5将重新加载该页面,而不是再次执行POST请求


显然,它也可以在没有POST的情况下工作,但是使用GET来执行修改操作并不是一个好主意。

您想要执行的操作称为PRG或。成功的POST请求后,您可以通过
位置
标题重定向到另一个页面。此页面将仅显示某些内容(例如状态消息),但不执行任何操作。然后点击F5将重新加载该页面,而不是再次执行POST请求


显然,它也可以在没有POST的情况下工作,但是使用GET进行修改操作并不是一个好主意。

如果一切都正确,您可以发送一个标题:

header('Location: http://www.yourdomain.com/another_page.php');

然后跳转到另一页

如果一切正常,您可以发送标题:

header('Location: http://www.yourdomain.com/another_page.php');

保存客户详细信息后,跳转到另一个页面

,重定向到其他页面,如“谢谢”页面。此外,您还可以在成功操作后在会话中存储一个标志,如
quote_submitted=1
。然后,当刷新被点击或提交时,检查它,以避免循环操作


否则,您是否有办法存储一些客户ID?然后,您可以检查客户是否保存了记录,这样就不会有重复的提交。

保存客户详细信息后,请重定向到其他页面,如“谢谢”页面。此外,您还可以在成功操作后在会话中存储一个标志,如
quote_submitted=1
。然后,当刷新被点击或提交时,检查它,以避免循环操作


否则,您是否有办法存储一些客户ID?然后,您可以检查客户是否保存了他的记录,这样就不会有重复提交。

首先,您应该在提交表单后重定向到其他页面。那一页通常表示成功或失败。由于没有任何东西可以阻止访问者返回表单页面并再次提交表单,因此使用会话变量是防止重新执行的最佳选择。虽然这不是傻瓜式的,因为当浏览器关闭时会话将过期,但它确实可以防止意外的重新提交。

首先,在提交表单后,您应该重定向到其他页面。那一页通常表示成功或失败。由于没有任何东西可以阻止访问者返回表单页面并再次提交表单,因此使用会话变量是防止重新执行的最佳选择。但这并不是傻瓜式的,因为当浏览器关闭时会话将过期,但它确实可以防止意外的重新提交。

如果表单处理需要一段时间(生成PDF可能需要时间),那么最好的第一步是阻止用户重新提交表单。使用javascript禁用submit按钮,并可能显示一个加载图标,以便他们知道发生了什么

一旦代码完成执行,您将希望将它们重定向到另一个页面,这样就不会出现刷新页面的问题

这很简单,只需发送一个标题

// do PDF and email code
// now redirect user to thank you page
header("Location: thank_you.php");
exit();

如果表单需要一段时间来处理(生成PDF可能需要时间),那么最好的第一步是阻止用户重新提交表单。使用javascript禁用submit按钮,并可能显示一个加载图标,以便他们知道发生了什么

一旦代码完成执行,您将希望将它们重定向到另一个页面,这样就不会出现刷新页面的问题

这很简单,只需发送一个标题

// do PDF and email code
// now redirect user to thank you page
header("Location: thank_you.php");
exit();

一种可能性是,实现post-redirect-get方法

简单地说,POST请求永远不会发送到浏览器。相反,您执行所有必要的操作并在会话中存储所需的信息,然后使用代码303进行重定向

$page = 'quote_done.php';
header('Location: '.$page, true, 303);
exit;
这样,浏览器将显示“quote_done.php”页面(GET请求),而不是POST请求的页面。这也是添加到历史记录中的页面,因此刷新和使用“后退”按钮将永远不会执行另一个POST请求。作为一个很好的副作用,您消除了关于重新发送数据的浏览器警告,通常用户无法决定接下来要做什么

我认为这种方法最大的问题是,您需要一个会话来存储错误消息,这意味着您必须依赖cookie。我