Php mySql为购物车选择具有可能重复ID的多个ID
我试图通过ID获得所有项目的成本,然后将它们添加到购物车中。我有两个问题: 1.)用户可能有多个具有相同ID的项目。使用mySql下面的方法不会选择该项目两次。在下面的示例中,我有三个ID为“01”的项目和两个ID为“07”的项目。但是,我的select语句只会选择每个ID一次。 2.)我在下面使用的方法在最后一个ID的末尾添加了一个逗号,因此我的语句将不起作用。我需要逗号在select的每个项目之间,但不在最后一个项目上。我如何解决这个问题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]) {
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的商品”,您是指购物车中的数量吗?是的