我一直在寻找这个答案的堆栈溢出,但似乎找不到与此相关的那个,而且我真的很难找到解决这个问题的方法。
这个购物车的想法是每个productid(来自数据库)是会话中数组的关键id(为了保持相关性,我想,如果所有productid都是唯一的,那就好了),如果它没有在它添加它们的产品中找到产品,或者在那一行发现产品相同的产品,它会添加一个产品。
这是逻辑:
$product_id = (int) $_POST['product_id'];
$qty = (is_numeric($_POST['qty'])) ? (int) $_POST['qty'] : 1;
$sql = "SELECT * FROM products WHERE id = $product_id";
$result = mysql_query($sql) or die (mysql_error());
if($result)
{
$row = mysql_fetch_row($result);
$product_id = (int) $row[0];
$product_array = array('product_id' => $product_id,
'product_code' => $row[1],
'product_name' => $row[2],
'image' => $row[5],
'qty' => $qty,
'price' => $row[6]);
// check if we've already got a cart key in the session array:
if(isset($_SESSION['cart']))
{
// loops through the items to find the row of the product being added to the already there cart session:
foreach($_SESSION['cart'] as $k => $v)
{
// if the cart key which is based on the product id, is in the array, dont add it again
if(in_array($k, $product_array))
{
// but add the desired qty to it:
$_SESSION['cart'][$k]['qty'] += $qty;
} else {
// otherwise if it's not in the array, then add it like the one when we created the cart session key:
$_SESSION['cart'][$product_array['product_id']] = $product_array;
}
}
} else {
// if not make one:
$_SESSION['cart'][$product_array['product_id']] = $product_array;
}
}
我遇到的问题是,如果我说将product1 id添加到购物车中,当我去添加产品2时(在添加ID为1的product1之后),它似乎又添加了一个数量以前的产品并没有添加到购物车,但以前的产品的另一个。
我只是不明白为什么会这样,任何回复都非常感谢。
杰里米。
答案 0 :(得分:0)
在回答您的问题之前,我必须提到互联网上安全性的重要性,因此您应该将任何数据库访问代码切换为PHP's DBO library。
NetTuts here和here以及here提供了一些非常好的教程。除了让你的代码更安全之外,它还会让它变得更容易,我将展示它。
您认为我遇到的具体问题是这一行in_array($k, $product_array)
。它并没有像你期望的那样比较阵列。值得庆幸的是,我们可以使用$product_id
来访问购物车中的数据。
随着PDO的更改以及使用$product_id
访问购物车,您的代码变得更像这样:
$product_id = (int) $_POST['product_id'];
$qty = (is_numeric($_POST['qty'])) ? (int) $_POST['qty'] : 1;
try {
// create db connection and make sure db/sql errors raise exceptions
$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ;
// query the database
$query = $db->prepare("SELECT * FROM products WHERE id=:product_id");
$query->execute(array('product_id' => $product_id));
// fetch the first result as an associative array
$product_array = $query->fetch();
if ($product_array) {
$product_id = $product_array['product_id'];
$product_array['qty'] = $qty;
// check if we've already got a cart key in the session array:
if (isset($_SESSION['cart']) && isset($_SESSION['cart'][$product_id])) {
$_SESSION['cart'][$product_id]['qty'] += $qty;
}
// if not make one
else {
$_SESSION['cart'][$product_id] = $product_array;
}
}
}
catch(PDOException $e) {
echo $e->getMessage();
}