Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mySql为购物车选择具有可能重复ID的多个ID_Php_Mysql_Mysqli - Fatal编程技术网

Php mySql为购物车选择具有可能重复ID的多个ID

Php mySql为购物车选择具有可能重复ID的多个ID,php,mysql,mysqli,Php,Mysql,Mysqli,我试图通过ID获得所有项目的成本,然后将它们添加到购物车中。我有两个问题: 1.)用户可能有多个具有相同ID的项目。使用mySql下面的方法不会选择该项目两次。在下面的示例中,我有三个ID为“01”的项目和两个ID为“07”的项目。但是,我的select语句只会选择每个ID一次。 2.)我在下面使用的方法在最后一个ID的末尾添加了一个逗号,因此我的语句将不起作用。我需要逗号在select的每个项目之间,但不在最后一个项目上。我如何解决这个问题 if($_SESSION[InCart]) {

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

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

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();

您可以使用
join
进行此计算,因为您需要重复。但是,查询生成起来更具挑战性:

SELECT SUM(cost) as cost
FROM cartItems c JOIN
     (SELECT 1 as itemNumber UNION ALL
      SELECT 1 UNION ALL 
      SELECT 2
     ) i
     ON i.itemNumber = c.itemNumber;

注意:您应该在查询中使用聚合将所有值添加到一起。这是使用SQL进行此计算的最佳方法。

您可以使用一个
连接来进行此计算,因为您需要重复。但是,查询生成起来更具挑战性:

SELECT SUM(cost) as cost
FROM cartItems c JOIN
     (SELECT 1 as itemNumber UNION ALL
      SELECT 1 UNION ALL 
      SELECT 2
     ) i
     ON i.itemNumber = c.itemNumber;

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

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

所以在车里你现在喜欢

$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列表(减去重复项)

在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。这是一个正则表达式,它匹配
^
项-
开头,因此它匹配
项-
,并将其删除。(请参见此处的实际操作)

所以结果会是这样的(我想,只是在我的脑子里做)

这很好,因为在MySql中通常不需要引用整数。这还具有清理它们以防止任何Sql注入的好处,因为强制转换它们不允许任何字母或特殊字符

我将
更改为单引号
,例如,当用作没有变量插值的查询时,它只是使它看起来更好

更新:添加项目

  $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;
假设
$\u POST['itemID']
是要添加的项目id,
$\u POST['quantity']
是要添加的数字。除了我要添加的以外,减法也是一样的

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

如果($items[$key]您应该跟踪购物车中每种类型的商品数量

所以在车里你现在喜欢

$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列表(减去重复项)

在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。这是一个匹配
^
的正则表达式,以
项-
开头,因此它匹配
项-
,并将其删除。(请参见此处的操作)

所以结果会是这样的(我想,只是在我的脑子里做)

这很好,因为在MySql中通常不需要引用整数。这还有一个好处,就是对它们进行清理以防止任何Sql注入,因为强制转换它们不允许使用任何字母或特殊字符

我将
更改为单引号
,例如,当用作没有变量插值的查询时,它只是使它看起来更好

更新:添加项目

  $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;
假设
$\u POST['itemID']
是要添加的项目id,
$\u POST['quantity']
是要添加的数字。除了我要添加的以外,减法也是一样的

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

if($items[$key]当您说“用户可能有多个具有相同ID的项目”时,你是在暗示购物车中的数量吗?是的。购物车中可能有3个,例如帽子。帽子的ID可能为03,因此在我的“化身”会话中,它会显示3次。那么,你是否也在购物车中显示数量?因为通常为了表示数量,我不希望你将相同的东西放在购物车中三次,而是不会o将数量表示为一个单独的字段。如果您坚持在购物车中保留每个唯一ID的副本,则@Gordon Linoff有一个适合您的查询。但这似乎不同于我使用过的任何购物车软件。使用
rtrim($txt,,'))
右键删除逗号。首先,在购物车中,你应该跟踪他们购买的每件商品的数量,然后简单地进行乘法运算。为什么需要查询更多的数据呢?与其添加重复的商品,不如为每件商品添加一个或多个这样的数字,然后用更多的商品递增。当你说“用户可能有多个相同ID的商品”,您是指购物车中的数量吗?是的