过去一周我正在构建自己的 php cart ,我遇到了一些问题。
我设法在购物车中添加新商品,网址如下所示。
http://blah-blah.com/order/index.php?action=add&id=84
问题很简单:如何防止在购物车中再次添加相同的商品 如果有人刷新页面?因为每当有人刷新页面时,它会将特定项目的数量更改为+1。
此外,在转到结帐页面后,如果他们按下浏览器中的后退按钮,则再次将数量更改为+1;
有什么建议吗?
答案 0 :(得分:4)
是的。让他们设置,而不是增加数量。
此外,您通常会对此类操作使用POST
(非GET
)请求。浏览器知道这一点,并狡猾地询问用户是否要重新提交POST
数据。
您的用户最干净的方法可能是使用AJAX完成整个过程。如果他们“退回”,他们只会回到他们访问过的最后一页而不会遇到麻烦。这相当于如何提交有关Stack Overflow的注释:您不能“返回”到提交步骤并最终写出重复的注释。
答案 1 :(得分:2)
我建议按照以下步骤避免多次提交和后退按钮问题:
完成处理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; .....”
像我说的那样我没有编码解决方案而是逻辑解决方案希望这有帮助