我的系统需要多个PHP会话吗?

时间:2015-04-24 13:09:19

标签: php session session-variables session-cookies

背景:

我们有一个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'];

5 个答案:

答案 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对象。

在此实现中,如果打开了两个选项卡,并且用户在第二个选项卡中进行了更改,则当他们刷新第一个选项卡时,将显示第二个选项卡中的更改。