昨天我在SO HERE上发布了一个关于我正在使用的多维$_SESSION
数组的问题,以跟踪我正在开发的购物车中的商品。其中一个非常有用的回复建议我创建$_SESSION
数组而不是多维数组,我同意这是一种更平滑的方法。
当用户点击“添加到购物车”中的任何一个时,会启动$_SESSION
阵列。商店页面上的按钮。我使用多维数组的原始代码是:
$quantity = 1;
// add first item from shop page
if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) {
$_SESSION['cart'] = array();
$_SESSION['cart'][$_POST['product_description']] = array('quantity' => $quantity, 'price' => $_POST['product_price']);
header("Location: http://website.com/cart.php");
}
这很好用,但我无法达到我想要的结果(见另一篇文章)。
我建议使用的代码是:
$quantity = 1;
// add first item from shop page
if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) {
$_SESSION['cart'][] = array('product_description'=> $_POST['product_description'], 'quantity' => $quantity, 'price' => $_POST['product_price']);
header("Location: http://website.com/cart.php");
}
并且效果很好并且允许我做我想做的事情(再次,请参阅其他帖子了解详情)。
...无论其
无论哪个'添加到购物车'在商店页面上单击按钮(只有四个),FIRST点击获取添加到$_SESSION['cart']
数组TWICE的信息。之后单击的每个其他按钮仅输入一次。同样,首先点击哪个按钮并不重要,无论如何都会发生这种情况。
以下是新print_r
数组代码$_SESSION
的结果:
Array
(
[0] => Array
(
[product_description] => iPhone case - Black
[quantity] => 1
[price] => 9.49
)
[1] => Array
(
[product_description] => iPhone case - Black
[quantity] => 1
[price] => 9.49
)
)
我已经搜索了SO和谷歌,了解为什么会这样,但无论我如何说出我的疑问,我都无法找到任何有用的东西。
它必须是我想念的简单......
真诚地感谢!
更新
为了澄清,商店页面上只有4个项目。再也不会有了。为了让事情变得简单,每个项目都有自己的“添加到购物车”。按钮。单击按钮后,用户将进入购物车页面,他们可以调整数量或删除项目,然后查看取消并清除购物车或继续购物。
答案 0 :(得分:0)
您的描述似乎表明您需要以下内容:
检查购物车是否存在,如果不存在则创建
然后将该项目添加到购物车
如果您还没有购物车,那么您发布的代码似乎只会添加一个项目。
我能想到的双重项目的唯一原因是代码比你发布的更多,并且你在“创建购物车”和后来的“添加项目”中都有“添加项目”位的代码“块。
这就是我要做的事情:
quantity = 1;
// ensure cart
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = array();
}
// add item from shop page
if(isset($_POST['add_item'])) {
$_SESSION['cart'][$_POST['product_description']] = array(
'quantity' => $quantity,
'price' => $_POST['product_price']
);
// or if you prefer the numeric indexed array:
// $_SESSION['cart'][] = array(
// 'product_description'=> $_POST['product_description'],
// 'quantity' => $quantity,
// 'price' => $_POST['product_price']);
header("Location: http://website.com/cart.php");
}
我已经修改了你的代码以保持逻辑简单,但是像@dognose评论:不要相信通过帖子传递的价格。攻击表单并发布不良数据以便以0.01美元的价格获取您的资料非常简单。
答案 1 :(得分:-2)
无法回答,因为未提供完整代码;但是:
$_SESSION = array_map("unserialize", array_unique(array_map("serialize", $_SESSION)));
将删除会话中的重复项。