购物车中每组选项的增量变量

时间:2014-02-22 06:52:09

标签: php

因此,我为使用此代码添加到购物车的每个项目设置了一组选项:

$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" }

1 个答案:

答案 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>(而不是集合的每个选项)。