【问题标题】:PHP store, retrieve and edit an array from databasePHP 存储、检索和编辑数据库中的数组
【发布时间】:2014-06-07 17:45:24
【问题描述】:

我在使用数组时遇到了问题,我对 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 和数量,但到时候...

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

先谢谢大家了,希望大家一起解决,多开脑洞=多知识=解决方案;)

【问题讨论】:

  • var_dump($cart) 显示什么?
  • $conn mysqli 对象还是pdo 对象?
  • @u_mulder 它显示NULL,但是当我用内爆回显它时,它显示1,1,1,
  • 在您的第一个try 中,您在prepare 语句中使用了变量。准备好的语句(或至少在 mySQLi::prepare 中)不允许以这种方式注入变量以防止 SQL 注入,所以我相信。尝试使用 bindParam 将变量添加到语句中。
  • @Beneto 在第一条语句中我正在从数据库中提取购物车,当我使用 implode 回显它时它可以正常工作,它会在购物车中显示数据但 array_key_exists 不起作用。跨度>

标签: php mysql arrays database pdo


【解决方案1】:

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

这将所有内容完全分开,因此编辑和扩展要简单得多。例如,这种方式可以让用户拥有多个购物车变得非常容易,就像亚马逊一样!

这大大简化了代码!

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

检索购物车:

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

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

添加项目:

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

编辑项目:

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

我希望这会有所帮助!

【讨论】:

  • 感谢您提供如此详尽的答案,但这对我没有帮助。提出一个全新的数据库结构并不是一个好的答案。我正在创建一个简单的购物车,不想让这么多数据库表使事情复杂化,每个用户只有一个购物车行,简单的ID=QTY 产品条目。无论如何,这就是我对这个项目的购物车结构的想法。
【解决方案2】:

您使用的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 并更新数据库以使购物车持久化。

【讨论】:

  • 好的,但我需要编辑/更新数组并根据购物车 ID 显示数据。
  • 我会仔细看看这个。
  • 抱歉没用...我需要存储、检索、编辑和存储,存储问题不大,因为编辑就地再存储。
  • 这很容易。将$cart 数组保留在会话中。当您更改某些内容时,只需执行更新查询。使用$_SESSION['cart'] = array(); 而不是$cart = array();。然后,您可以使用您的购物车,而无需一次又一次地检索它。对其进行更改时,只需执行 json_encode 并进行更新。
  • 我不使用$cart = array(); 我正在从数据库行中拉出购物车,所以当用户关闭浏览器时,再去一次购物车完好无损。这是我对$_SESSION['cart'] 的问题。我可以将购物车放入会话变量中,但我必须从数据库中提取购物车数据,因此会话对我的情况没有多大帮助。如果您可以为我在存储、检索、编辑...方面的确切情况提供一个示例,那将很有帮助。
猜你喜欢
  • 2019-01-18
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2015-04-26
  • 2012-04-20
相关资源
最近更新 更多