mySql为购物车

时间:2017-01-04 02:57:09

标签: php mysql mysqli

我试图通过ID获取所有项目的费用,然后将它们添加到购物车中。我有两个问题:

1。)用户可能有多个具有相同ID的项目。使用下面的方法mySql将不会选择该项目两次。在下面的示例中,我有三个ID为' 01'和两个ID为' 07'的项目。但是我的select语句只会选择一次ID。 2.)我在下面使用的方法在最后一个ID的末尾添加一个逗号,所以我的语句不起作用。我需要在每个项目之间使用逗号进行选择,而不是最后一个。我该如何解决这个问题?

if($_SESSION[InCart])
{
    foreach($_SESSION[InCart] as $result) 
    {
    $Items .= $result . ',';
    } 
}

include('../connect.php');

// EXAMPLE RESULT MAY LOOK LIKE THIS
// echo $Items (would print: 01,09,07,01,01,23,07,)

$sql = "SELECT Cost FROM cartItems WHERE itemNumber IN ('$Items')";
$result = $conn->query($sql);
$Cost = 0;
if ($result->num_rows > 0) 
{
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $Cost = $Cost + $row["Cost"];
    }
} 
else {
    echo "0 results";
}

$conn->close();

2 个答案:

答案 0 :(得分:2)

您应该跟踪购物车中每种类型的商品数量。

所以在购物车中你现在喜欢

$items =  [1,1,1,2,6]; 

你应该像这样拥有它们

$items = [
   'item-1' => 3,
   'item-2' => 1,
   'item-6' => 1
];

我从不使用整数作为关键键,如果你排序(或其他一些数组函数)一个数组,它会通过重新排序或重置数字键来搞乱它,[1=>3,2=>1,6=>1]可能会成为[0=>3,1=>1,2=>1]例如。您可以通过在其前面加上item-这样的字符串来使其更具可读性并保护它们,那么您只需执行以下操作:

   $itemIDs = [];
  foreach( $items as $itemID => $Quantity ){
      //replace item- with empty, you could also use substr, or even str_replace.
      $itemIDs[] = (int)preg_replace('/^item-/', '', $itemID);
  }

这将为您提供一个像您一样的ID(减去重复项)

  $itemIDs = [1,2,6];

进行搜索并使用while循环

while($row = $result->fetch_assoc()) {
     //correlate it back to original $items using the key [item-{ID}] to get the quantity
    $Cost += ( $row["Cost"] * $items['item-'.$row['ID']] ); //cost + ( item cost * quantity )
}

将商品费用乘以购物车中的数量,将其加到您的总和中....

对于sql中的这一位:

  $sql = "SELECT Cost FROM cartItems WHERE itemNumber IN ('$Items')";

而不是这样做

  $sql = 'SELECT Cost FROM cartItems WHERE itemNumber IN ('.implode(',', $itemIDs) .')';

您不需要引用它们,因为我们将它们转换为foreach循环中的int。这是一个与^匹配的正则表达式,以item-开头,因此它与item-匹配并将其删除。 (请参阅此处https://regex101.com/r/pLqDWw/1

    (int)preg_replace('/^item-/', '', $itemID);

这样就会出现(我想,只是在脑子里这样做)

    $sql = 'SELECT Cost FROM cartItems WHERE itemNumber IN (1,2,6)';

这很好,因为通常整数不需要在MySql中引用。这也有利于消毒它们以防止任何Sql注入,因为它们不会允许任何字母或特殊字符。

我将"更改为单引号',它只是在用作没有变量插值"$var"的查询时使其看起来更好。

更新:添加项目

  $items = isset($_SESSION['items']) ? $_SESSION['items'] : []; //check if items array is saved in the session.

  $key = 'item-'.$_POST['itemID'];

  if( !isset( $items[$key] ) ){
       $items[$key] = $_POST['quantity'];
  }else{
      $items[$key] += $_POST['quantity'];
  }

  $_SESSION['items'] = $items;

假设$_POST['itemID']是项ID,$_POST['quantity']是要添加的数字。减去同样的情况除外,我会添加

  if(  $items[$key] <= 0 ){
    unset(  $items[$key] ); //remove item from list.
 }

答案 1 :(得分:1)

您可以使用var td = $("#"+trId).find("td"); var chkBox = td.eq(0).find('input'); if(chkBox.is(':checked')){ chkBox.prop('checked', false); } 进行此计算 - 因为您明确需要重复项。但是,生成查询更具挑战性:

join

注意:您应该在查询中使用聚合来将所有值一起添加。这是为此目的使用SQL的最佳方式。