【发布时间】:2015-05-17 05:12:55
【问题描述】:
我正在尝试编写一个包含以下项目的页面:
一个产品类别,该产品类别中该类别的唯一项目,以及用户可以在每个类别中选择“X”个所述唯一项目的数量。
在购物车中选择时格式如下所示:
Item Category
Each unique id of said Category
Qty of Category Ordered
这就是我定义每个部分的方式。
$product_name = $_POST["product_name"] - 类别
$product_id = $_POST["product_id"]; - 类别中每个项目的唯一标识符。
$product_qty = $_POST["product_qty"] - 选择的数量
$product_id 是一个字符串。 Let's say I have unique IDs of 2,4,6,8, so that when a quantity of 1 is selected, only ID 2 is chosen.如果选择数量 4,则选择 ID 2、4、6、8。正因为如此,我使用explode将字符串变成了一个数组,这样字符串中的每个ID都是唯一的。
$product_ids = explode(',', $product_id);
所以我所有的值都被表示出来了,我可以从主页成功地获取它们。但我不知道如何使购物车本身正常运行。类别本身在添加到购物车后应该保持静态,除非它从购物车中删除 - 只有类别中的唯一 ID 应该更改。如果用户选择数量 2,但随后决定选择数量 4,我需要购物车在一个类别下添加或减去适当的 ID,而不添加新类别。唯一应该添加新类别的情况是用户从另一个类别中选择数量。有谁知道我怎样才能完成我想做的事情?
编辑:让我粘贴购物车代码,但对我要温柔,因为这是我第一次尝试。这是我正在尝试做的,但它并没有按照我想要的方式工作。请注意,我定义了很多变量,因为我正在测试许多选项。我不一定都需要它们。
`<?php
session_start();
include_once("config.php");
//empty cart by distroying current session
if(isset($_GET["emptycart"]) && $_GET["emptycart"]==1) {
$return_url = base64_decode($_GET["return_url"]); //return url
session_destroy();
header('Location:'.$return_url);
}
//add item in cart
if(isset($_POST["type"]) && $_POST["type"]=='add') {
$product_name = $_POST["product_name"];
$product_qty = $_POST["product_qty"];
$return_url = base64_decode($_POST["return_url"]); //return url
$product_id = $_POST["product_id"];
$product_ids = explode(',', $product_id);
$product_select = implode(',', array_slice($product_ids, 0, $product_qty));
$product_final = explode(',', $product_select);
foreach ($product_final as $id) {
$results = $mysqli->query("SELECT * FROM products WHERE id = '$id'");
}
$obj = $results->fetch_object();
if ($results) {
$new_product = array(array('name'=>$product_name, 'code'=>$id, 'qty'=>$product_qty));
if(isset($_SESSION["products"])) {
$found = false;
foreach ($_SESSION["products"] as $cart_itm) {
if ($cart_itm["code"] == $id) {
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$product_qty);
$found = true;
}
else {
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$cart_itm["qty"]);
}
}
if($found == false) {
$_SESSION["products"] = array_merge($product, $new_product);
}
else {
$_SESSION["products"] = $product;
}
}
else {
$_SESSION["products"] = $new_product;
}
}
header('Location:'.$return_url);
}
if(isset($_GET["removep"]) && isset($_GET["return_url"]) && isset($_SESSION["products"])) {
$id = $_GET["removep"];
$return_url = base64_decode($_GET["return_url"]);
foreach ($_SESSION["products"] as $cart_itm) {
if($cart_itm["code"]!=$id) {
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$cart_itm["qty"]);
}
$_SESSION["products"] = $product;
}
header('Location:'.$return_url);
}
?>`
另一个编辑:
我从新定义的数组中取出 $product_select 字符串的版本。购物车按我现在想要的方式运行,但是...如何将 $product_select 字符串传递到下一页?
`<?php
session_start();
include_once("config.php");
//empty cart by distroying current session
if(isset($_GET["emptycart"]) && $_GET["emptycart"]==1) {
$return_url = base64_decode($_GET["return_url"]); //return url
session_destroy();
header('Location:'.$return_url);
}
//add item in cart
if(isset($_POST["type"]) && $_POST["type"]=='add') {
$product_name = $_POST["product_name"];
$product_qty = $_POST["product_qty"];
$return_url = base64_decode($_POST["return_url"]); //return url
$product_id = $_POST["product_id"];
$product_ids = explode(',', $product_id);
$product_select = implode(',', array_slice($product_ids, 0, $product_qty));
$results = $mysqli->query("SELECT * FROM products WHERE id = '$product_select'");
if ($results) {
$new_product = array(array('name'=>$product_name, 'qty'=>$product_qty));
if(isset($_SESSION["products"])) {
$found = false;
foreach ($_SESSION["products"] as $cart_itm) {
if ($cart_itm["name"] == $product_name) {
$product[] = array('name'=>$cart_itm["name"], 'qty'=>$product_qty);
$found = true;
}
else {
$product[] = array('name'=>$cart_itm["name"], 'qty'=>$cart_itm["qty"]);
}
}
if($found == false) {
$_SESSION["products"] = array_merge($product, $new_product);
}
else {
$_SESSION["products"] = $product;
}
}
else {
$_SESSION["products"] = $new_product;
}
}
header('Location:'.$return_url);
}
if(isset($_GET["removep"]) && isset($_GET["return_url"]) && isset($_SESSION["products"])) {
$product_name = $_GET["removep"];
$return_url = base64_decode($_GET["return_url"]);
foreach ($_SESSION["products"] as $cart_itm) {
if($cart_itm["name"]!=$product_name) {
$product[] = array('name'=>$cart_itm["name"], 'qty'=>$cart_itm["qty"]);
}
$_SESSION["products"] = $product;
}
header('Location:'.$return_url);
}
?>`
【问题讨论】:
-
如果你想让
product_final成为一个数组,你不需要implodearray_slice然后explode再一次。array_slice返回一个数组。explode从字符串返回数组,implode从数组返回字符串,你可以这样做:$product_final = array_slice($product_ids, 0, $product_qty); -
再一次 - 变量在那里是因为我在做实验。我遇到的问题是,每当“id”是一个字符串时,我最终都会为每个字符串添加一个唯一的购物车。例如,字符串 2,4,6,8 是一个购物车项目/类别,然后字符串 2,4 成为另一个单独的项目/类别。如果您更改数量,我需要购物车在哪里运行,您不会在购物车中获得全新的商品/类别......如果这有意义的话。
-
我可以让购物车按照我想要的方式运行的一种方法是从新定义的数组中删除 product_id - 它按预期工作,但是我如何将 product_id 传递到下一页?我对主帖进行了编辑以显示代码,而新定义的数组中没有 product_id。
-
好吧,如果您的客户点击“添加到购物车”的数量为 10.000,您会在堆栈中写入 10.000 个相同的 id 吗?
-
我可以在我的 SQL 查询中使用 LIMIT 来完成我想要完成的事情吗?有没有办法将每个类别的每个数量传递到最终页面并将其插入到 LIMIT 的值中?
标签: php