Подскажите, пожалуйста, как сгруппировать одинаковые товары в корзине? Необходимо сделать так, чтобы одинаковый товар (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;
}
?>
У тебя здесь неправильно примерно всё.
Начиная прямо с кривого кода добавления товара в корзину. Где вместо ажно пяти строчек должна быть одна,
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 что там надо выводить;
}
Всегда цепляй алиасы к таблицам.
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, к примеру.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
выскакивает ошибка
Есть страничка постов с табами для каждой категории, выглядит это так:
Я понимаю, что эту ошибку уже тысячу раз рассматривалиНа просторах интернета я нашёл три решения этой ошибки в моём случае