Группировка товаров по ID в корзине

85
20 апреля 2022, 12:40

Подскажите, пожалуйста, как сгруппировать одинаковые товары в корзине? Необходимо сделать так, чтобы одинаковый товар (c тем же id) при добавлении в корзину увеличивал свою цену и количество, а не добавлялся, как новый. Пробовал и GROUP BY и Count, GROUP_CONTACT, но так и не понял, почему не работает. Надеюсь на вашу помощь!

<?php
session_start();
require $_SERVER['DOCUMENT_ROOT'].'/config/safemysql.class.php';
$db = new safeMysql();
$action = $_POST["action"];
if ($action == 'show'){
   if (!(isset($_SESSION['cart']))){
       echo 'У вас нет заказов. Корзина пуста!';
       exit;
   };
   $cart = $_SESSION['cart'];
   if (count($cart) == 0){
       echo 'У вас нет заказов. Корзина пуста!';
       exit;
   }
   for ($i = 0; $i < count($cart); $i++){
       $idProduct = $cart[$i]["idProduct"];
       $result  = $db->query('SELECT products.*, gallery.* FROM products INNER JOIN gallery on products.id=gallery.id_products  WHERE id_products = '.$cart[$i]["idProduct"].' LIMIT 1');
       while ($row = $db->fetch($result)){
           echo'
            <div class="card" id="card">
              <a class="card__link" href="#">
                <div class="card__images">
                  <img class="card__image" src="content/products/'.$row["image"].'" width="214" height="162" alt="" />
                </div><!-- .card__images -->
              </a>
              <a class="card__title" href="#">'.$row["name"].'</a>
              <div class="card__footer">
                <p class="card__price">'.$row["price"].'</p>
                <div class="card__quantity">
                  <div class="quantity">
                    <button class="quantity__minus" type="button" aria-label="-1"></button>
                    <input class="quantity__input" type="text" value="1" />
                    <button class="quantity__plus" type="button" aria-label="+1"></button>
                  </div><!-- .quantity -->
                  <button class="card__delete" type="button" onClick="delFromCart('.$row["id_products"].')">Удалить</button>
                </div><!-- .card__quantity -->
              </div><!-- .card__footer -->
            </div><!-- .card -->
           ';
       }
   }
}
############################
if ($action == 'add'){
    $cart = $_SESSION['cart'];
    $id = $_POST['id'];
    $newProduct["idProduct"] = $id;
    $cart[count($cart)] = $newProduct;
    $_SESSION['cart'] = $cart;
}
###########################
if ($action == 'del'){
    $id = $_POST["id"];
    $newCart = array();
    $cart = $_SESSION['cart'];
    for ($i = 0; $i < count($cart); $i++){
        $idProduct = $cart[$i]["idProduct"];
        if ($id != $idProduct){
            $newCart[count($newCart)] = $cart[$i];
        }
    }
    $_SESSION['cart'] = $newCart;
}
?>

Answer 1

У тебя здесь неправильно примерно всё.
Начиная прямо с кривого кода добавления товара в корзину. Где вместо ажно пяти строчек должна быть одна,

if ($action == 'add'){
    $_SESSION['cart'][] = $_POST['id'];
}

без всех этих перекладываний из пустого в порожнее.

а если подумать, то корзина дложна прсдставлять из себя двумерный массив, где ключ - это ид товара, а значение - количество.

if ($action == 'add'){
    // проверяем, есть ли товар уже в корзине
    $_SESSION['cart'][$_POST['id']] = $_SESSION['cart'][$_POST['id']] ?? 0;
    // увеличиваем количество на единицу
    $_SESSION['cart'][$_POST['id']]++;
}

после этого не придется ничего группировать в запросе

// в запрос пихаем не саму переменную, а плейсхолдер
$sql = 'SELECT * FROM products p, gallery g WHERE p.id=g.id_products AND id_products IN (?a)';
// выполняем запрос сразу получая массив со всеми товарами
$result  = $db->getAll($sql, array_keys($_SESSION['cart']));
// выводим и получаем количество и сумму
foreach ($result as $row) {
    $qty = $_SESSION['cart'][$row['id']];
    $sum = $row['price'] * $qty;
    echo $row['price'], bla bla что там надо выводить;
}
Answer 2

Всегда цепляй алиасы к таблицам.

SELECT G.ID, G.NAME, SUM(P.PRICE), LIST(p.name) 
  FROM products p INNER JOIN gallery g on p.id=g.id_products
WHERE g.id = 'твой id корзины'
GROUP BY G.ID, G.NAME 

В группировке и на выходе(в select-e) у тебя должны быть одни и те же поля, хотя бы из соображений того, что одной твоей корзине соответствует не одна запись из продуктов. Те поля, которые не участвуют в группировке ты тоже можешь увидеть в select-e, но только через какой нибудь list, к примеру.

READ ALSO
Объясните в чем разница

Объясните в чем разница

В гайде использовался этот кусок кода:

157
Не работает ajax подгрузка постов WordPress

Не работает ajax подгрузка постов WordPress

Есть страничка постов с табами для каждой категории, выглядит это так:

98
Ошибка Trying to access array offset on value of type null

Ошибка Trying to access array offset on value of type null

Я понимаю, что эту ошибку уже тысячу раз рассматривалиНа просторах интернета я нашёл три решения этой ошибки в моём случае

111