PHP从数据库中存储,检索和编辑数组

时间:2014-06-07 17:45:25

标签: php mysql arrays database pdo

我遇到了数组的问题,我在PHP中并不是那么新,但我有一点操作复杂数组的经验,就像我现在需要的那样。

我正在构建购物车,我对购物车的想法是每个用户都会拥有的数据库行,购物流程应该是这样的

当用户购买产品时,如果购物车脚本中不存在产品,则应将产品添加到购物车,例如1=1或数组$cart = [ [1]=>'1' ]表示产品ID1数量1,现在如果产品已存在于购物车脚本中,则只需更新数量,例如1=2等等,以获得更高的数量。

这是我完成上述

的不良尝试

PHP

<?php session_start();

require_once('config.php');

$member_id = '1'; // Test data
$pr_id     = filter_input(INPUT_POST, 'pr_id', FILTER_SANITIZE_STRING); // Sending ID with jQuery/AJAX which works fine of course
$pr_qty    = '1'; // Start quantity
$up_qty    = '5'; // Test data

try {
  $getCart = $conn->prepare("SELECT cart FROM members WHERE member_id = :member_id ");
  $getCart->bindParam(':member_id', $member_id);
  $getCart->execute();
  $cart    = $getCart->fetch(PDO::FETCH_ASSOC);

  if(array_key_exists($pr_id, $cart)) {
     $cart[$pr_id] = $up_qty . ',';
  }
  else {
     $cart[$pr_id] = $pr_qty . ',';
  }

  $updateCart = $conn->prepare("UPDATE members SET cart = :cart WHERE member_id = :member_id ");
  $updateCart->bindParam(':member_id', $member_id);
  $updateCart->bindParam(':cart', implode($cart));

  if($updateCart->execute()) {
     echo '1';
  }

}
catch(PDOException $error) {
      echo 'Error: ' . $error->getMessage();
}

$conn = null;
?>

稍后,我应该能够从数据库中检索产品ID和数量,但是到时候......

我在这工作了大约三天,我无望,我到处搜索,找到了很多关于多维数组的教程,但我认为我的问题有点独特或者我只是愚蠢足够,无法解决它。

提前感谢大家,我希望我们能够一起解决它,更多的大脑=更多的知识=解决方案;)

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,实现此问题的一种方法是每个购物车拥有多个数据库行,而不是将所有数据编码为一个。我建议有一个像这样的数据库结构:

Database Diagram

这完全区分了所有内容,因此编辑和扩展更加简单。例如,这种方式可以让用户很容易拥有多个购物车,就像亚马逊一样!

这简化了很多代码!

我不会为你写出代码,因为我没有时间,但我会解释它是如何工作的,所以你可以自己去吧! / p>

要检索购物车:

您可以通过以下方式获取属于用户的任何购物车:

  • 获取用户ID
  • 使用该用户ID从Cart表中搜索cart_id。如果每个用户只有一个,请选择第一个。
  • 使用该cart_id从Cart_items表中选择所有行。这将为您提供该购物车中的每个产品
  • 要获取每种产品的信息,请使用产品表从产品表中选择产品行。

添加项目:

  • 获取上述购物车ID
  • 检查是否存在包含产品ID和购物车ID的行
  • 如果有,请增加数量(见下文)
  • 如果没有,请创建行。

编辑项目:

  • 如上所述获取购物车ID。
  • 获取您要修改的产品的产品ID
  • 使用这2个ID更新该行Cart_items以更改数量等。

我希望这有帮助!

答案 1 :(得分:0)

您使用的implode功能对您的购物车不起作用,因为数组索引会丢失,因此您会丢失产品ID。但您可以serializejson_encode购物车阵列。

$_SESSION['cart'] = array(
    1 => 1,
    6581 => 4
);

$json = json_encode($_SESSION['cart']);

然后,您可以将$json字符串存储到您的成员表中。如果您想稍后从数据库中获取它,则必须json_decode并将函数结果再次放入$_SESSION['cart']

$_SESSION['cart'] = json_decode($json, true);

如您所见,我已将$cart变量放入$_SESSION。因此,当用户在您的站点上导航时,您无需再次从数据库中检索它。这将减少数据库的负载并加快脚本速度。对于购物网站而言,网站尽可能快地加载非常重要,这样客户就可以享受购物和留在网站上。

要添加新产品或增加现有位置的数量,只需执行以下操作:

function addProduct($id)
{
    if (isset($_SESSION['cart'][$id]))
        $_SESSION['cart'][$id]++;
    else
        $_SESSION['cart'][$id] = 1;
}

调用addProduct之后,您应该json_encode并更新数据库以使购物车保持不变。