我试图通过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();
答案 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的最佳方式。