添加未添加到产品代码的产品

时间:2016-03-09 19:47:00

标签: php arrays cart

我一直在寻找这个答案的堆栈溢出,但似乎找不到与此相关的那个,而且我真的很难找到解决这个问题的方法。

这个购物车的想法是每个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之后),它似乎又添加了一个数量以前的产品并没有添加到购物车,但以前的产品的另一个。

我只是不明白为什么会这样,任何回复都非常感谢。

杰里米。

1 个答案:

答案 0 :(得分:0)

在回答您的问题之前,我必须提到互联网上安全性的重要性,因此您应该将任何数据库访问代码切换为PHP's DBO library

NetTuts herehere以及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();
}