Интернет магазин. Хранение корзины товаров.

Статус
В этой теме нельзя размещать новые ответы.

arhat78

Новичок
Всем привет! В процессе написания магазина возник один немаловажный вопрос (он обсуждался в этом топике, но понять технику выполнения пока не получилось) : добавляю в корзину ботинок Арт.10001 размер 20, в корзине выводится этот ботинок с размером 20; затем добавляю этот же ботинок, но с размером 24 - а в корзине уже выводится этот последний ввод с размером 24. Вот как поменять код, какой применить принцип, чтобы в корзину добавлялся ботинок одного id, но с разными выбранными размерами? У размеров своя таблица в mysql, с id. Заранее благодарен :)

Вот это добавление товара в корзину:

PHP:
<form action="index.php" method="get">
<input type="hidden" name="view" value="add_to_cart">
<input type="hidden" name="id" value="<?=$product['id']?>">
<select name="size" >
<?php
$sql="SELECT * FROM sizes WHERE `sizes`.`id_boot`='$id' ";
echo $sql.'<br>';
$a=mysql_query($sql);
while ($b = mysql_fetch_array($a))
{
      echo  "<option  value='$b[2]' >  $b[2] </option>";
}
?>
</select>
<input type="submit" value="Добавить в корзину">
</form>

А это вывод в корзине:

PHP:
foreach ($_SESSION['cart'] as $id => $quantity):
        $product = get_product($id);
      
        $b['size'] = $_SESSION['cart_size'][$id];

        if (!empty($_GET['size'])) {echo $_GET['size'];}
      ?>

      <tr>
          <td align="center"><?=$product['title']; ?></td>
          <td align="center">  <?=$b['size'];?> </td>
          <td align="center">  <?=number_format($product['price'],2); ?> руб</td>
          <td align="center"><input type="text" size="2" name="<?=$id; ?>" maxlength="2" value="<?=$quantity; ?>" /></td>
          <td align="center">  <?=number_format($product['price'] * $quantity ,2); ?> руб</td>
      </tr>
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Перемещено, прошу не некропостить
 

PttRulez

Новичок
Может, не до конца понимаю вопрос. Но в админке надо просто поставить чекбоксов с размерами. Когда добавляете/правите товар, то просто они полетят у вас POST'ом в обработчик.
Т.е. не тэг select, а много
Код:
<input type="checkbox" name = "size[]" value = "39"/>
<input type="checkbox" name = "size[]" value = "40"/>
<input type="checkbox" name = "size[]" value = "41"/>
<input type="checkbox" name = "size[]" value = "42"/>
Кстати ,а какая у вас структура таблицы размеров? какие в ней столбцы?
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
поздравляю! вы - настоящий русский интернет-магазин!
вы совершенно правильно нормализовали базу: один товар, множество вариантов - цвета, размеры.
теперь, как настоящему русскому интернет-магазину, вам надо сменить ваших студентов(таджиков, молдаван, другой вариант), и переписать половину сайта, в каждом действии указывать не id товара, а комбинацию product_id,size_id,color_id,
потом переписать еще раз и для каждой комбинации забить отдельный product_id,
потом начать писать новую версию и выбросить ее
 

arhat78

Новичок
Может, не до конца понимаю вопрос. Но в админке надо просто поставить чекбоксов с размерами. Когда добавляете/правите товар, то просто они полетят у вас POST'ом в обработчик.
Т.е. не тэг select, а много
Код:
<input type="checkbox" name = "size[]" value = "39"/>
<input type="checkbox" name = "size[]" value = "40"/>
<input type="checkbox" name = "size[]" value = "41"/>
<input type="checkbox" name = "size[]" value = "42"/>
Кстати ,а какая у вас структура таблицы размеров? какие в ней столбцы?

О, мой вопрос в новой теме появился! А то потерял его, в замешательстве :)

У меня размеры выпадающим списком... Не знаю, практичны ли будут чекбоксы...? Размеры же из таблицы выводятся...

Это структура таблицы размеров:

sizes CREATE TABLE `sizes`
(
`id` int(5) NOT NULL AUTO_INCREMENT,
`id_boot` int(10) NOT NULL,
`size` int(5) NOT NULL,
`description` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

А ещё раз про вопрос: например, мне нужен один ботинок, но с тремя разными размерами; вот я добавляю в корзину 20й, 22й и 24й размеры, захожу в корзину, а там только одна строка с этим ботинком и только с последним размером (24м), а нужно, чтобы в корзине выводились все три выбранные размеры...
 

Тугай

Новичок
Принцип тут такой, что один ботинок с тремя разными размерами еще не изобрели. :)
$_SESSION['cart'] - должен быть таким массивом, где каждый его элемент это ассоциативный массив, который содержит всю нужную информацию.
Код:
foreach($_SESSION['cart'] as $cart_product) {
   echo $cart_product['product_id'], $cart_product['size_id'], $cart_product['quantity'];
}
 

rdbn

Новичок
ну во первых как написано выше(grigori,) с начало нормализуйте базу под ваши нужды, затем напишите код проверки при добавление товара в корзину на наличие уже этого товара, если товар с таким id есть в корзине то проверяйте есть ли у него такой размер, если есть то нечего не делать, если нет то добавить к нему новый размер.

PS по идее как то так должно быть.
 

artoodetoo

великий и ужасный
Попробую своими словами: товар в корзине (и вообще везде) удобно идентифицировать уже включая размер, цвет и всё что еще потребуется. Для этого придуман термин SKU. Собственно "ботинок модели ABC 42-го размера коричневый" это и есть товарная позиция. У нее должен быть простой не составной идентификатор.

То есть понадобится новая таблица.
 

arhat78

Новичок
Попробую своими словами: товар в корзине (и вообще везде) удобно идентифицировать уже включая размер, цвет и всё что еще потребуется. Для этого придуман термин SKU. Собственно "ботинок модели ABC 42-го размера коричневый" это и есть товарная позиция. У нее должен быть простой не составной идентификатор.

То есть понадобится новая таблица.
То есть, получается, что нужна таблица, где у каждого ботинка уже задан свой размер? Разве так проще? И как размеры выводить списком для выбора?.....
 

arhat78

Новичок
ну во первых как написано выше(grigori,) с начало нормализуйте базу под ваши нужды, затем напишите код проверки при добавление товара в корзину на наличие уже этого товара, если товар с таким id есть в корзине то проверяйте есть ли у него такой размер, если есть то нечего не делать, если нет то добавить к нему новый размер.

PS по идее как то так должно быть.
grigori написал очень красивым слогом, но это вышеперечисленные действия нужно правильно понять, а с этим пока туго... :D

rdbn, а вот с проверкой мысль интересная! У меня она мелькала, но практическую реализацию пока не смог придумать и осуществить.... нужно поэкспериментировать....
 

arhat78

Новичок
Принцип тут такой, что один ботинок с тремя разными размерами еще не изобрели. :)
$_SESSION['cart'] - должен быть таким массивом, где каждый его элемент это ассоциативный массив, который содержит всю нужную информацию.
Код:
foreach($_SESSION['cart'] as $cart_product) {
   echo $cart_product['product_id'], $cart_product['size_id'], $cart_product['quantity'];
}
Тоже интересная мысль...... Тугай, получается, этот код же в корзине нужно применить, при выводе заказа?
 

Тугай

Новичок
arhat78, я подсказываю самый короткий путь, чтобы наступить на грабли, о которых написал grigori

Нужно изменить код, который обрабатывает форму "Добавить в корзину", ну и потом код который эту корзину выводит.

Без таблицы, где у каждого ботинка задан свой размер можно обойтись, но код SKU присутствует всегда так или иначе.

Для ботинков с размером, например можно кодировать через дефис 1001-20 и хранить в одном поле, или хранить в разных полях код продукта и код размера, но как только появится еще цвет и/или материал, такой кодировки уже не хватает.
 

rdbn

Новичок
Вообще можно еще так сделать, создать таблицы товар, размер и таблицу товар_размер, и через последнею уже определять у какова товара какие размеры, поэтому же принципу и цвета.

насчет выпадающего списка, главное взять информацию из базы, а как ты ее представляешь пользователю тебе решать, списком или боксами, это не важно, можно вообще в инпут вывести :). Тут уже вопрос насколько это удобно и практично для пользователя.
 

AnrDaemon

Продвинутый новичок
Как у вас вообще размер оказался отдельно от товара?...
 

arhat78

Новичок
arhat78, я подсказываю самый короткий путь, чтобы наступить на грабли, о которых написал grigori

Нужно изменить код, который обрабатывает форму "Добавить в корзину", ну и потом код который эту корзину выводит.

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

Для ботинков с размером, например можно кодировать через дефис 1001-20 и хранить в одном поле, или хранить в разных полях код продукта и код размера, но как только появится еще цвет и/или материал, такой кодировки уже не хватает.
Тугай, а код SKU - это как и зачем? у ботинка же есть свой id; разве по нему нельзя? Есть же одна таблица ботинка с id, и таблица размеров, где каждый размер ассоциируется с id ботинка....
 

rdbn

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

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