Поэтому у меня есть набор опций, установленных для каждого элемента, добавленного в корзину покупок с помощью этого кода:
$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');
Подробнее о том, как это работает, см. В моем предыдущем вопросе о переполнении стека . Не хотите размещать слишком много здесь, чтобы создать дублирующий вопрос!
Теперь, когда у меня все работает, я столкнулся с другой проблемой. И мое решение заключалось в создании переменной, которая увеличивается после каждого набора параметров для определенного идентификатора продукта.
См. В моей таблице базы данных есть столбец identifier
. Все эти параметры вводятся в таблицу базы данных. И идентификатор должен соответствовать параметрам, установленным для идентификатора продукта.
Например, допустим, у меня есть следующая схема корзины покупок:
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
Вы заметите, что поле идентификатора пуст, Это то, что я пытаюсь добавить … Мне нужно следующее, чтобы соответствовать банкам, содержимое которых должно быть в пределах:
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()
возвращает следующий массив при var_dump()
.
array(2) { [0]=> string(5) "Runts" [1]=> string(5) "Bears" } array(2) { [0]=> string(6) "Swirls" [1]=> string(6) "Twists" }