Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помощь в логике и реализации Корзины покупателя
 
 автор: provodnik   (18.04.2007 в 17:18)   письмо автору
 
 

Доброго времени суток.

Прошу оказать посильную помощь в создании корзины. Ознакомился с темами на форуме ( около 20 ), но к сожалению только больше запутался. Запись массивов в сессию и работа с этими данными пока мне не по силам.... Не понял в каком файле инициировать сессии, в каком файле производить выборку данных, в каком файле дописывать данные нового товара к уже существующим товарам в корзине...

Будущий магазинчик будет реализован на MySql.

Есть таблица с инф. о покупателях (clients):
id | name
1 | Вася
2 | Петя

Есть таблица с товарами ( cat ):
id | name | price
1 | стул | 500
2 | шкаф | 1000

Есть таблица с товарами ( tovar ):
id | id_clients | id_tovara | kolvo
1 | 1 | 2 | 5
2 | 1 | 2 | 4
где id_clients - id из таблицы clients; id_tovara - id из таблицы cat


Имеется файл catalog.php, который выводит из базы данные товара. Рядом с товаром сделана форма: кнопка "Добавить в корзину" и текстовый инпут для указания количества товара:

    echo "<form method=post actions=\"http://". $_SERVER['HTTP_HOST']."/sbuy.php\">
        <input type=image border=0 src=\"http://".$_SERVER['HTTP_HOST']."/images/cart.gif\" class=images_type>
        <input type=text maxlength=3 size=3 name=kolvo>
        <input type=hidden name=id_tovara value=".$item['id']."> // хидден со значением id покупаемого товара
        </form>";


Хочется осуществить стандартную корзину покупателя: Покупатель нажимает кнопку "добавить в корзину", осуществляется перезагрузка страницы, и где - нибудь в уголке страницы показаны изменения в корзине (к примеру: "в вашей корзине 1 товар").
Потом пользователь идет выбирает опять. И опять при нажатии у другого товара кнопку "добавить в корзину" этот товар добавляется и в уголке страницы уже пишется "в вашей корзине 2 товара".
А при переходе в саму корзину выбираются данне из БД с id, которые числятся в сессии, производится расчет денег (с этим у меня проблем нет). И кнопка "оформить заказ", при котором данные отправляются менеджеру и записываются в БД как "заказ в обработке" (с этим тоже проблем нет).
И так же присутствует кнопка "очистить корзину".
Это, как я понял из прочитанных тем осуществляется так:

unset($_SESSION["Имя_сессии"); 
session_destroy(); 


Очень сильно прошу помочь...

   
 
 автор: provodnik   (19.04.2007 в 09:29)   письмо автору
 
   для: provodnik   (18.04.2007 в 17:18)
 

Пооомогиите пожалуйста, товарищи программисты !

   
 
 автор: Trianon   (19.04.2007 в 10:24)   письмо автору
 
   для: provodnik   (18.04.2007 в 17:18)
 

Скрипт добавления товара может выглядеть примерно так:

<? //sbuy.php
   
include'config.inc.php';
   
session_start();
   @
id_user $_SESSION['id_user'];
   if(!
$id_user)
       die(
'Вы не зарегистрировались.
            Работа с корзиной возможна только после регистрации'
);


   @
$kolvo $_POST['kolvo'];
   if(
$kolvo <= || intval($kolvo) != $kolvo)
       die(
'Некорректное значение в поле количества товара');
   
$kolvo intval($kolvo);

   @
$id_tov $_POST['id_tovara'];
   if(
$kolvo <= || intval($kolvo) != $kolvo)
       die(
'Некорректное значение в поле номера товара');
   
$kolvo intval($kolvo);

   
$sql "SELECT tovar.*, cat.id  AS cid, name
               FROM cat LEFT JOIN tovar ON cat.id=id_tovara
             WHERE id_clients = 
$id_user
               AND cat.id  = 
$id_tov";
   
$res mysql_query($sql) or die("Ошибка при обращении к БД");
   if(
mysql_num_rows($res) < 1)
       die(
"Указанный товар отсутствует");
   
$row mysql_fetch_array($res);

   
$sql = ($row['id'] !== null)
         ? 
"UPDATE tovar SET kolvo = kolvo + $kolvo WHERE id = $row['cid']"
         
"INSERT INTO tovar (id_clients, id_tovara, kolvo) VALUES
                (
$id_user$id_tov$kolvo)";

   
$res mysql_query($sql) or die("Ошибка при обращении к БД");
   
$kolvo += $row['kolvo'];

   echo 
"Товар #$row[cid] '$row[name]' добавлен - в корзине $kolvo шт.";


   
 
 автор: coloboc66   (19.04.2007 в 10:48)   письмо автору
 
   для: Trianon   (19.04.2007 в 10:24)
 

Я бы не взялся писать собственный магазин с нуля, основываясь только на прочитаных темах форума и задавая на форуме вопросы. Это довольно объемная тема. Я в свое время купил учебник, где пошагово растолковывалось, как магазин реализовать, давался комментированный код, а на дискете был этот же готовый код магазина. После такого обучения уже можно писать свой код со своими идеями реализации. Хотя, может, у меня просто не так много мозгов...

[поправлено модератором]

   
 
 автор: Trianon   (19.04.2007 в 11:16)   письмо автору
 
   для: coloboc66   (19.04.2007 в 10:48)
 

Просто у каждого свой подход к обучению :)

Готов согласиться с тем, что в теме имеются подводные камни (и довольно острые).
Касаются они в основном стадии расчета с покупателем.
В этом ключе я обычно стараюсь ничего непроверенного не советовать.

В остальном же тема как тема... Довольно хорошо подходит для иллюстрации разных приемов и принципов. Почему бы и нет?

   
 
 автор: provodnik   (19.04.2007 в 11:18)   письмо автору
 
   для: provodnik   (18.04.2007 в 17:18)
 

Trianon , спасибо, но это немного не то. Вы мне привели пример, при случае, когда "Работа с корзиной возможна только после регистрации". Хотелось бы наоборот - дать пользователю возможность выбирать товар, а уже в итоге, при просмотре им своей корзины и подтверждения покупки, спрашивать его данные и заносить в БД.

У меня вопросы при работе с сессиями. Т.е.:
1. Не понимаю, нужно ли стартовать сессии на страницах с общим каталогом или же только на страницах, где есть форма с кнопкой "добавить в корзину"?
2. Проблема с синтаксисом при добавлении данных (id товара => количество) в массив в сессию
3. Проблема с работой с этим массивом: чтение данных, выборка из него.
4. Вопрос про оптимальное количество физических файлов. Т.е. у меня сейчас есть 1 файл (catalog.php) с подробным описанием товара и кнопкой добавления в корзину. И 1 файл (sbuy.php), который будет "файлом крзины". Будет добавлять данные в массив сессии, пересчитывать количество и общую стоимость, удалять товар из корзины и при подтверждения покупки выводить форму для запроса данных покупателя, для последующего занесения их в БД и отправкой "сигнала" менеджеру. Как оптимальнее рассчитать структуру?
5. Если не инициировать сессию на всех страницах каталога, не потеряются ли данные корзины?
И вот в каком файле что делать с сессиями, никак не разберусь. То у меня ничего не добавляется в массив, то наоборот, при обновлении страница данные в массиве дублируются...


coloboc66 - Я бы не взялся писать собственный магазин с нуля.
Я противоположного мнения. Учусь (и довольно успешно) с помощью этого форума, читая массу тем уже созданных и задавая новые вопросы. Дело в том, что у меня около 15 учебников по PHP, Mysql. правда в электронном виде. Но к сожалению я не всегда там нахожу необходимые ответы...

Заранее спасибо за ответы...

   
 
 автор: Trianon   (20.04.2007 в 10:19)   письмо автору
 
   для: provodnik   (19.04.2007 в 11:18)
 

>Trianon , спасибо, но это немного не то. Вы мне привели пример, при случае, когда "Работа с корзиной возможна только после регистрации".

Это скорее для программиста строка - она означает лишь то, что переменная $id_user к этому моменту должна быть определена. Через сессии или еще как - не столь важно.


>Хотелось бы наоборот - дать пользователю
Это утверждение подразумевает, что работать с пользователями Вы умеете.
Собственно, на этом допущении и приводился код. Потому что если оно неверно - откладывайте задачу и решайте предыдущую.

>возможность выбирать товар, а уже в итоге, при просмотре им своей корзины и подтверждения покупки, спрашивать его данные и заносить в БД.
>
Уж коль скоро
Так будет даже проще. В этом случае корзину можно хранить в сессии.
Или в кукисах. Но в кукисах есть огранирчение на размер.

>У меня вопросы при работе с сессиями. Т.е.:
>1. Не понимаю, нужно ли стартовать сессии на страницах с общим каталогом или же только на страницах, где есть форма с кнопкой "добавить в корзину"?

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

>2. Проблема с синтаксисом при добавлении данных (id товара => количество) в массив в сессию

Какая?

>3. Проблема с работой с этим массивом: чтение данных, выборка из него.

Какая?

>4. Вопрос про оптимальное количество физических файлов.

Количество файлов скриптов и распеделение кода по ним может быть любым - лишь бы Вы не путались в коде. Обычно, когда каждая страница и каждый обработчик формы размещены в отдельном файле - в коде разбираться несколько легче. Но это вовсе не истина в последней инстанции.


>5. Если не инициировать сессию на всех страницах каталога, не потеряются ли данные корзины?

Если корзину хранить где?
В сессии? Тогда не потеряются, поскольку нечему будет теряться. Сложно вылить суп, не укупив кастрюлю.
В собственных кукисах - тем более не потеряются - сессия к ним не имеет отношения.

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

Лучше говорить на конкретном примере. Я показал лишь код-обработчик. Код страницы с формой Вы не привели.

   
 
 автор: provodnik   (20.04.2007 в 10:49)   письмо автору
 
   для: Trianon   (20.04.2007 в 10:19)
 

частично сделал, путём проб и ошибок. Прошу указать ошибки, елси имеются:

При нажатии кнопки "добавить в корзину" отрабатывает код на этой же странице:

<?
if (isset ($_GET['actions']) && $_GET['actions'] == "add_to_cart")
{
    if (!
intval($_GET['item'])) echo "кривой запрос!"// проверяем на целочисленность
    
else
    {
        
$id intval($_GET['item']);
        
$_SESSION['tovar'][] = $id// добавили в массив сессии id выбранного товара
        
echo "<center>Товар добавлен в Вашу корзину<br /><br />
        <center>"
;
    }
}
?>


И файл корзины:

<?
if (isset($_GET['actions']) && $_GET['actions'] == "drop_id" && isset($_GET['id_pos_in_sess'])) // если в GETе пришло "удаление" одной позиции из корзины
{
    if (
is_int($_GET['id_pos_in_sess']) >= "0"// если пришедшее целое положительное число
    
{    
        
$get_id_pos $_GET['id_pos_in_sess'];
        foreach(
$_SESSION['tovar'] as $id_in_sess => $znachenie
        {
            if (
$id_in_sess == $get_id_pos// если перем. из GETа = индексу в массиве сессии
            
{
                unset(
$_SESSION['tovar'][$id_in_sess]); // удаляем эту позицию из сессии
                
$_SESSION['tovar'] = array_values($_SESSION['tovar']); // переиндексируем значения индексов в сессии
            
}
        }
    }
    else { echo 
"кривой запрос!"; }
}

else if (isset(
$_GET['actions']) && $_GET['actions'] == "clear_cart"// если в GETе пришло "очистить корзину"
{
    unset(
$_SESSION['tovar']);     // очищаем
    
session_destroy();            // удаляем
    
echo "Корзина очищена";
}

else if (empty(
$QUERY_STRING)) // если в GETе ничего не пришло, коннектимся к БД и выводим инфу
{
    if (isset(
$_SESSION['tovar']) && $_SESSION['tovar'] != "")
    {
        foreach(
$_SESSION['tovar'] as $id_in_sess => $znachenie)  // перебираем массив
        
{
            
$query mysql_query("select * from cat where id = '".$znachenie."'"); // выводим инфу из базы
            
$num mysql_num_rows ($query);
            
$armysql_fetch_array ($query); 
            echo 
"Название: ".$ar['name']."<br>";
            echo 
"Цена: ".$ar['price']."<br>";
            echo 
"<a href=\"http://"$_SERVER['HTTP_HOST']."/cart/drop_id/".$id_in_sess."/ \">Удалить это наименование из корзины</a><br><br>";
        }
    }
    if (
$num "0")
    {
        echo 
"<br><a href=\"http://"$_SERVER['HTTP_HOST']."/cart/clear_cart/\">Очистить корзину</a>";
        echo 
"<br><a href=\"http://"$_SERVER['HTTP_HOST']."/cart/buy/\">Оформить заказ</a>";
    }
}
else echo 
"H-Z";
?>


Прошу посмотреть на грамотность и на возможные дыры и ашыпки.
И еще, при пепеиндексации массива ($_SESSION['tovar'] = array_values($_SESSION['tovar']); // переиндексируем значения индексов в сессии) - удаляется часть массива почему то...
Подскажите, стоит его вообще переиндексировать после удаления какого-нибудь индекса? или использовать как есть?

Спасибо за ответы.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования