Вывод товара в корзине

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

arhat78
Сообщения: 9
Зарегистрирован: 11 июн 2014, 10:27

11 июн 2014, 10:31

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

Добавление товара в корзину:

Код: Выделить всё

<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.'
';
        $a=mysql_query($sql);
        while ($b = mysql_fetch_array($a))
        {
              echo "<option  value='$b[2]' >  $b[2] </option>";
        }
        ?>
        </select>
        <input type="submit" value="Добавить в корзину">
        </form>


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

Код: Выделить всё

 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>
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

11 июн 2014, 11:44

Либо все товары с уникальным id и он добавляется в корзину вместе с количеством например, либо добавляется id, размер, количество. Если по второму пути, то нужно проверять тот ли размер у артикула и предпринимать соответствующие меры.
[syntax=Delphi] [/syntax]
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

11 июн 2014, 12:28

Думаю, что структуру нужно изменить на:
Item_ID, Model_ID, Size, Color, Price;
где Item_ID - описывает уникальный ID товара, в свою очередь сам товар описывается моделью (Model_ID), размером и цветом (Size, Color)
В текущем состоянии id_boot эквивалентен Model_ID
Грубо говоря, синие ботинки одинакового цвета и модели будут иметь разные ID - тогда никаких проблем с корзиной не будет.
Таблица sizes пригодится для хранения допустимых размеров для конкретной модели.
It's a long way to the top if you wanna rock'n'roll
arhat78
Сообщения: 9
Зарегистрирован: 11 июн 2014, 10:27

11 июн 2014, 15:19

Duncon писал(а):Либо все товары с уникальным id и он добавляется в корзину вместе с количеством например, либо добавляется id, размер, количество. Если по второму пути, то нужно проверять тот ли размер у артикула и предпринимать соответствующие меры.

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


Код: Выделить всё

if ($product !== get_product($id)) {
    echo $_GET('id');
}
if ($b['size'] !== $_SESSION['cart_size'][$id]) {
    echo $_GET['size'];
} 

только не могу догнать, как же здесь добавлять новую строчку с id и размером....
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

11 июн 2014, 17:10

Работу с массивами почитайте на досуге..
[syntax=Delphi] [/syntax]
arhat78
Сообщения: 9
Зарегистрирован: 11 июн 2014, 10:27

11 июн 2014, 17:12

Duncon писал(а):Работу с массивами почитайте на досуге..

Зачем на досуге? Уже часа полтора перечитываю :) Но пока никак.... :confused:
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

11 июн 2014, 19:31

Намёк:
$_SESSION['cart']['id'] = '';
$_SESSION['cart']['id']['cart_size'] = '';
Логично ведь так массив строить а не $_SESSION['cart_size'][$id]
Далее просто работа с многомерным массивом

Код: Выделить всё

function addItem($id, $size, $c=1){
     foreach($_SESSION['cart'] as $key=>$items){
         if($items['id'] != $id || $items['cart_size'] != $size) Continue;
     ...
         return;
     } $_SESSION['cart'][]=array('id'=>$id,..);
} 
Это для наглядности
Я вообще стараюсь так не делать идти по пути id количество, тогда это всё выглядит как

Код: Выделить всё

function addItem($id,$c=1){
     if(isset($_SESSION['cart'][$id])) $_SESSION['cart'][$id]+=$c;
     else $_SESSION['cart'][$id]=$c;
} 
Ещё в последние годы беру идентификацию клиента на себя т.е. не использую механизм сессий в целях избежания возможных проблем.. Но это уже сложней и имеет смысл когда действительно планируется высокая нагрузка..
id уникальный, в позиции товара полностью присутствуют все поля с указанием какой цвет, какой размер и всё что нужно.. Делать перекрёстные запросы в отдельные таблицы плохой фэншуй для производительности магазина, особенно в местах когда нужно вывести скажем 100 товаров за раз, получается что нужно лазить из таблицы в таблицу и выводить с этим учётом, вместо простого запроса с учётом возможных сортировок по цене например.. Это всё не важно когда у тебя 10 показов в секунду, но вот когда к тебе разом заваливается 1000 человек, то тут весь быдлокод выливается в аренду дорогих серверов, я встречал с десяток магазов на популярном битрексе которые тупо лагают даже там при этом с меньшими нагрузками.. К тому же есть сезонные отрасли которые могут 80% года быть вообще никак не посещаемыми, а в пики шкалить.. Короче лучше сразу правильно учиться программировать.
[syntax=Delphi] [/syntax]
arhat78
Сообщения: 9
Зарегистрирован: 11 июн 2014, 10:27

11 июн 2014, 22:09

Duncon писал(а):Намёк:
$_SESSION['cart']['id'] = '';
$_SESSION['cart']['id']['cart_size'] = '';
Логично ведь так массив строить а не $_SESSION['cart_size'][$id]
Далее просто работа с многомерным массивом

Код: Выделить всё

function addItem($id, $size, $c=1){
     foreach($_SESSION['cart'] as $key=>$items){
         if($items['id'] != $id || $items['cart_size'] != $size) Continue;
     ...
         return;
     } $_SESSION['cart'][]=array('id'=>$id,..);
} 
Это для наглядности
Я вообще стараюсь так не делать идти по пути id количество, тогда это всё выглядит как

Код: Выделить всё

function addItem($id,$c=1){
     if(isset($_SESSION['cart'][$id])) $_SESSION['cart'][$id]+=$c;
     else $_SESSION['cart'][$id]=$c;
} 

Duncon, благодарю! Есть над чем перед сном поразмыслить................. :)

Вот есть такой case добавления товара:

Код: Выделить всё

case('add_to_cart'):
      $id = $_GET['id'];
      $size = $_GET['size'];
      $_SESSION['cart_size'][$id] = $size;
      $add_item = add_to_cart($id);
      $_SESSION['total_items'] = total_items($_SESSION['cart']);
      $_SESSION['total_price'] = total_price($_SESSION['cart']);
      header('Location:index.php?view=product&id='.$id); 
   break; 
Меняю здесь и добавляю:

Код: Выделить всё

case('add_to_cart'):
      $id = $_GET['id'];
      $size = $_GET['size'];
      $_SESSION['cart']['id'] = '';
      $_SESSION['cart']['id']['cart_size'] = '';
      $add_item = add_to_cart($id);
      $_SESSION['total_items'] = total_items($_SESSION['cart']);
      $_SESSION['total_price'] = total_price($_SESSION['cart']);
      header('Location:index.php?view=product&id='.$id); 
   break; 
Затем в выводе в корзине вместо этого:

Код: Выделить всё

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

         if (!empty($_GET['size'])) {echo $_GET['size'];} 
вставляю это:

Код: Выделить всё

function addItem($id, $size, $c=1){
     foreach($_SESSION['cart'] as $key=>$items){
         if($items['id'] != $id || $items['cart_size'] != $size) Continue;
     ...
         return;
     } $_SESSION['cart'][]=array('id'=>$id, 'size'=>$size, 'quantity'=>$c..);
}   
А вото что за Continue.........., и что return возвращает......, ещё с $c нужно как то поработать, и сам размер в таблице корзины вместо <?=$b['size'];?> как то выводить нужно......

Это за 15 минут сразу столько вопросов возникло ))))))))))))))
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

11 июн 2014, 23:05

Про case не понятно add_to_cart для наглядности бы видеть.. Continue переходит на следующий круг цикла вместо выполнения следующими за ним директивами, return прерывает выполнение, выходит из функции, останавливает выполнение кода на странице итд итп.. Вообще это базовый синтаксис php и повод для чтения..
[syntax=Delphi] [/syntax]
arhat78
Сообщения: 9
Зарегистрирован: 11 июн 2014, 10:27

11 июн 2014, 23:09

Duncon писал(а):Про case не понятно add_to_cart для наглядности бы видеть.. Continue переходит на следующий круг цикла вместо выполнения следующими за ним директивами, return прерывает выполнение, выходит из функции, останавливает выполнение кода на странице итд итп.. Вообще это базовый синтаксис php и повод для чтения..

Код: Выделить всё

function add_to_cart($id)
{
    if(isset($_SESSION['cart'][$id]))
     {
        $_SESSION['cart'][$id]++;
        return true;
     }     
     
    else
    {
        $_SESSION['cart'][$id] = 1;
        return true;
    }
        return false; 
} 
А Continue и return - вы многоточие между ними поставили, поэтому я и замялся..... :)
Ответить