防止脚本在页面刷新时重新执行操作

时间:2011-06-07 14:45:41

标签: php shopping-cart

过去一周我正在构建自己的 php cart ,我遇到了一些问题。

我设法在购物车中添加新商品,网址如下所示。

http://blah-blah.com/order/index.php?action=add&id=84

问题很简单:如何防止在购物车中再次添加相同的商品 如果有人刷新页面?因为每当有人刷新页面时,它会将特定项目的数量更改为+1。

此外,在转到结帐页面后,如果他们按下浏览器中的后退按钮,则再次将数量更改为+1;

有什么建议吗?

6 个答案:

答案 0 :(得分:4)

是的。让他们设置,而不是增加数量。

此外,您通常会对此类操作使用POST(非GET)请求。浏览器知道这一点,并狡猾地询问用户是否要重新提交POST数据。

您的用户最干净的方法可能是使用AJAX完成整个过程。如果他们“退回”,他们只会回到他们访问过的最后一页而不会遇到麻烦。这相当于如何提交有关Stack Overflow的注释:您不能“返回”到提交步骤并最终写出重复的注释。

答案 1 :(得分:2)

我建议按照以下步骤避免多次提交和后退按钮问题:

  1. 如上所述,您应该使用POST方法提交表单而不是GET。
  2. 阻止来自此处所述的同一会话的多个表单提交:http://phpsense.com/php/prevent-duplicate-form-submission.html
  3. 完成处理POST请求后,您应该重定向到确认URI 或更好地使用相同的URI,如下所示:

    //处理POST请求后重定向
    header(“Location:”。$ _SERVER [“REQUEST_URI”]);
    出口;

答案 2 :(得分:0)

正如Tomalak所说,最好使用POST数据进行操作。 您可以与POST数据结合使用的另一点是使用重定向标头响应用户,即使他尝试刷新或返回数据也不会再次处理。

基本示例:

<?php
if( !empty($_POST) ){
  // do stuff with POST datas then
  header("location: mypage.php\n");
  exit;
}

答案 3 :(得分:0)

您可以使用

<?php
header("Location: http://www.example.com/"); /* Redirect browser */

要将用户重定向到上一页?按刷新或后退/前进按钮将不会再次加载添加页面。

答案 4 :(得分:0)

我知道这个问题已经结束,但我有一个替代方案,我想到了这个确切的问题。

这个想法是在之前和之后创建$ _POST数据的哈希。对于这个例子,我使用了md5,但你可以使用你想要的任何算法:

$postHash = md5(serialize($_POST).date("dMY",time()));
if(!isset($_SESSION['post'])) $_SESSION['post']="Not yet set.";

然后所有通常位于页面顶部的处理代码只需放入以下IF:

    if($_SESSION['post']!=$postHash) {
     // Perform actions
    } else {
  echo "Cannot post duplicate data";
}

然后,在页面底部(或处理完成后,任何数据库调用已被执行):

$_SESSION['post'] = md5(serialize($_POST).date("dMY",time()));

仍然存在一些问题,但似乎工作正常。希望这会有所帮助。

答案 5 :(得分:-1)

您好我没有针对您的编码解决方案,而是针对此问题的逻辑解决方案尝试一下它可能对您有所帮助,它帮助了我

我遇到了同样的问题,我在我的网址(GET变量)中使用“ShoppingCart?AddToCart = 1&amp; .....”作为了解用户想要添加的方式产品到购物车,每次刷新页面时,同一产品一次又一次地添加

当我收到 AddToCart请求时,我的工作方式是首先执行将添加产品的方法 然后执行另一种显示购物车内容的方法(这就是问题所在)

我改变了逻辑

现在每当我收到相同的 AddToCart请求时,我执行相同的第一种方法将内容添加到购物车

但是

现在不是执行第二种方法来显示购物车的内容而是使用标题(“Location:ShoppingCart?ViewCart = 1”)

这意味着在执行第一个将内容添加到购物车的方法后,我将 ViewCart请求发送到我的购物车页面,现在每次我发出 AddToCart请求它正确地将内容添加到购物车,之后每当我尝试刷新页面尝试复制AddToCart请求时,我总是以 ViewCart请求结束,页面只显示购物车内容,而不是向购物车添加任何其他内容

这里的技巧是每次我收到“ShoppingCart?AddToCart = 1&amp; .....”我执行添加功能和标题功能,以此结束在网址中显示“ShoppingCart?ViewCart = 1”,而不是原来的“ShoppingCart?AddToCart = 1&amp; .....”

现在,即使有些人试图刷新页面或使用浏览器中的后退按钮返回页面,他们总是会发出“ShoppingCart?ViewCart = 1”请求,他们从未看到< strong> URL中的“ShoppingCart?AddToCart = 1&amp; .....”

像我说的那样我没有编码解决方案而是逻辑解决方案

希望这有帮助