背景:
我们有一个4阶段的购买流程 - 价格,客户详情,付款,订单确认。
我们有多种产品可以使用相同的网址通过相同的购买流程购买。
我们使用PHP会话存储大量的报价数据,并存储直到订单完成。
许多PHP会话变量在我们的所有产品中共享,例如“grossprice”“product”等
问题:
如果客户购买了一些东西,然后开始在另一个选项卡中浏览网站,那么获取另一个产品的报价 - 当前的系统设置意味着共享的php会话变量可以重新开始互相编写搞砸了第一次购买。例如,“最终价格”可能会在最后阶段发生变化,因为用户的报价完全不同。
我是自学成才,所以这对我来说都是一个学习曲线 - 我意识到系统设置中存在一个很大的问题。
在每个购买阶段页面的顶部,我有以下代码:
session_name("buying_system");
session_start();
我认为我应该根据购买的产品设置会话名称吗?
这样的事情:
session_name($_GET['product'] . "_buying_system");
然后用户可以在两个选项卡中进行购买,针对不同的产品,会话永远不会相互冲突或覆盖?
潜在解决方案1:
$_SESSION["quotesarray"] = "";
$quotesArray = array();
$quotesArray["product1"] = array();
$quotesArray['product1']['gross'] = 49.99;
$quotesArray['product1']['sell'] = 45.99;
$quotesArray["product2"] = array();
$quotesArray['product2']['gross'] = 20.99;
$quotesArray['product2']['sell'] = 25.99;
$_SESSION["quotesarray"] = $quotesArray;
$quotesArray["product2"] = "";
$quotesSessionArray = requestSession("quotesarray");
echo $quotesSessionArray['product1']['gross'];
答案 0 :(得分:2)
用户只有一个会话,因此您需要以不同方式处理此用例。一种简单的方法是一次只允许一个引用;或者,您应该使用产品ID作为数组键创建一个引号数组并为其添加新引号:
$quotes = [
'product_1' => ..., // info about the quote for this product
'product_2' => ..., // info about the quote for this product
];
然后将整个数组存储在会话中。加载页面时,您可以根据产品ID访问报价。
答案 1 :(得分:1)
每件事都很好...... 如果您使用此功能,您的多个会话正在运行..
session_start();
session_name("buying_system");
session_name("buying_system");
session_start();
答案 2 :(得分:0)
通常所有标签只有一个会话。会话密钥保存到cookie中,如果他对购物车执行某些操作,则会在所有选项卡中进行更改。
答案 3 :(得分:0)
根据定义,会话是:
两个或多个通信设备之间或计算机与用户之间的对话,对话或会议
当用户在站点上打开多个选项卡时,标准解决方案是确保初始会话在所有选项卡中都可用(这是默认行为)。如果用户在第一个选项卡中获得了报价或将项目添加到购物车,则第二个选项卡中应该提供相同的信息。如果在第二个选项卡中添加了新的报价或购物车项目,则当用户刷新页面时,它应反映在第一个选项卡中。
标签不是新会话:它们只是用户可以用来组织自己的工作流程的工具。
如果您的网站允许用户为同一项目获取不同的报价,请为每个项目开发标识符,并将引号附加到用户会话中的各种标识符。用户将能够确定购物车中的哪个报价是可接受的,并使用不需要的报价删除产品。
答案 4 :(得分:0)
我认为最好的方法是开发一个代表产品的类。
class Product { }
在会话中,您可以保留用户具有Quote的产品对象:
$_SESSION['quotes']
您可以为Products实现容器类或将它们存储在数组中。无论哪种方式,您都会根据用户操作从$_SESSION['quotes']
添加或删除产品。
编写会话时,会话处理程序将序列化并存储Product对象。加载会话时,将反序列化Product对象。
在此实现中,如果打开了两个选项卡,并且用户在第二个选项卡中进行了更改,则当他们刷新第一个选项卡时,将显示第二个选项卡中的更改。