因此,我为使用此代码添加到购物车的每个项目设置了一组选项:
$optionsSelected = array();
if (!empty($_POST['productOption']))
{
foreach ($_POST['productOption'] as $options)
$optionsSelected[] = $options;
}
$_SESSION['options'.$productID] = $optionsSelected;
$key = $productID . ":" . base64_encode(serialize($optionsSelected));
$_SESSION['cart'][$key]++;
header('location: /shop/cart');
有关其工作原理的详细信息,请参阅我的previous question on Stack Overflow。不想在这里放置太多来创建重复的问题!
既然我已经完成了所有工作,我遇到了另一个问题。我的解决方案是创建一个在某个产品ID的每组选项后增加的变量。
请参阅,我的数据库表中有一个identifier
列。所有这些选项都输入到数据库表中。标识符需要与产品ID设置的选项相匹配。
例如,假设我有以下购物车布局:
Product Name Option Names Qty
33.8 Oz Jar Runts, Bears 1
33.8 Oz Jar Swirls, Twists 1
现在这将插入到我的数据库表中,如下所示:
orderNumber optionName productID identifier
randomNumb Runts 33.8 Oz Jar
randomNumb Bears 33.8 Oz Jar
randomNumb Swirls 33.8 Oz Jar
randomNumb Twists 33.8 Oz Jar
你会注意到标识符字段是空的,这就是我想要添加的内容......我需要以下内容来匹配内容应该在的jar:
orderNumber optionName productID identifier
randomNumb Runts 33.8 Oz Jar 1
randomNumb Bears 33.8 Oz Jar 1
randomNumb Swirls 33.8 Oz Jar 2
randomNumb Twists 33.8 Oz Jar 2
我想到了以下代码:(注意$ identifier变量)
foreach($_SESSION['cart'] as $key => $quantity)
{
$product = explode(':', $key);
$productId = $product[0];
$optionsSelected = unserialize(base64_decode($product[1]));
$id = $productId;
$statement = "INSERT INTO KC_OrderProducts (orderNumber, productID, qty) VALUES (:orderNumber, :productID, :qty);";
$query = $db->prepare($statement);
$results = $query->execute(array(
":orderNumber" => $orderNumber,
":productID" => $id,
":qty" => $quantity
));
$identifier = 0;
if($optionsSelected > 0){
foreach($optionsSelected as $option)
{
$identifier++;
$statement = "INSERT INTO KC_OrderOptions (orderNumber, optionName, productID, identifier) VALUES (:orderNumber, :optionName, :productID, :identifier)";
$query = $db->prepare($statement);
$results = $query->execute(array(
":orderNumber" => $orderNumber,
":optionName" => $option,
":productID" => $id,
":identifier" => $identifier
));
}
}
}
这段代码让我走近了,我的桌子看起来如下:
orderNumber optionName productID identifier
randomNumb Runts 33.8 Oz Jar 2
randomNumb Bears 33.8 Oz Jar 1
randomNumb Swirls 33.8 Oz Jar 2
randomNumb Twists 33.8 Oz Jar 1
正如您所看到的,选项不再与产品匹配,这意味着每个订单都会被错误地完成,只是因为订单混乱了。
我尝试将$identifier = 0;
置于foreach
块之外,但这导致表中的每一行都获得了新的标识号。 1,2,3,4
而不是1,1,2,2
所以,我的问题是,我需要对$identifier = 0;
和$identifier++
做些什么来实现我想要的目标。或者有更好的方法来处理这个问题吗?
更新
$ optionsSelected varialble,当var_dump()
在运行时返回以下数组时。
array(2) { [0]=> string(5) "Runts" [1]=> string(5) "Bears" } array(2) { [0]=> string(6) "Swirls" [1]=> string(6) "Twists" }
答案 0 :(得分:0)
移动$identifier
的初始化,使其在外部foreach
循环之前立即执行:
$identifier = 0; // <-- to here
foreach($_SESSION['cart'] as $key => $quantity)
{
...
并移动$identifier
的增量,使其在内循环之前立即执行:
if($optionsSelected > 0){
$identifier++; // <-- to here
foreach($optionsSelected as $option)
{
...
这种方式初始化$identifier
以处理整个购物车(而不是每个购物车商品),并且每当您的脚本添加一组选项时,它就会增加< / em>(而不是集合的每个选项)。