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

Форум PHP

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

 

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

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

тема: Создание корзины на сайте
 
 автор: durable   (27.02.2010 в 11:35)   письмо автору
 
 

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

Оформлять заказы могут только зарегистрированные пользователи, поэтому корзину буду хранить в базе данных, а не в сессии и не в кукисах, для того что бы при выходе пользователя состояние заказа сохранялось. Получается есть таблица в которой:
id (autoincrement)
id_user
id_tovar
colichestvo

И логика работы с корзиной (заказ нового товара в определенном количестве, редактирование корзины) мне тоже понятна.

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

  Ответить  
 
 автор: sasha1133   (27.02.2010 в 11:56)   письмо автору
 
   для: durable   (27.02.2010 в 11:35)
 

может что то вроде этого:

Когда пользователь нажимает "добавить товар", сначала делаем запрос к базе данных, не помню как записать, но что то типо того SELECT id FROM table WHERE id_user='ид пользователя' AND id_tovar = 'ид_товара'. Если такой товар у этого пользователя уже есть, то прибавляем 1 к colichestvo, если нет - добавляем новую строку в таблицу с новым товаром и количеством, равным 1 (либо сколько там выбрал пользователь)

  Ответить  
 
 автор: durable   (27.02.2010 в 13:19)   письмо автору
 
   для: sasha1133   (27.02.2010 в 11:56)
 

Дело в том, что на страницу будет выводиться до 50 позиций товара. Пользователь будет иметь возможность поставить напротив каждого товара количество и поместить его в корзину (заказ товара поставщику). Как например вот на этом сайте: http://www.elevel.ru/catalog/4177/
А по каждому из выбранных делать запрос в базу не хочется :-)

  Ответить  
 
 автор: sl1p   (27.02.2010 в 13:30)   письмо автору
 
   для: durable   (27.02.2010 в 13:19)
 

SELECT id FROM table WHERE id_user='ид пользователя' AND id_tovar IN(1,4,5,20,21,22).
Склеиваем пост или откуда там приходят данные о выбранных товарах, например так:
mysql_query("SELECT id FROM table WHERE id_user='{$_user_id}' AND id_tovar IN(".implode(",", $_POST['id_tovar']).")");

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

  Ответить  
 
 автор: durable   (28.02.2010 в 00:18)   письмо автору
 
   для: sl1p   (27.02.2010 в 13:30)
 

Это конечно хорошо, но давайте по порядку.
К примеру у меня есть форма каталога товара в которой:

<form name="katalog" action="" method="post">
<input  type="text" name="id_1" value="0" />
<input  type="text" name="id_2" value="0" />
...
<input  type="text" name="id_48" value="0" />
<input  type="text" name="id_49" value="0" />
<input  type="text" name="id_50" value="0" />
<input  type="submit" name="ok" value="В корзину" />
+ может быть какие то дополнительные скрытые поля
</form>

Так вот, как такую форму обработать, ведь обработчик не будет знать имена полей для элементов заранее id_1, id_2 и т.д. Может перебирать весь массив POST и проверять - первые три символа == "id_"?
Потом приведенный выше запрос в базу и наверное через array_dif получить массив с теми товарами которые надо добавить? Остальные значит надо UPDATE?

Вобщем вот именно в этом моменте главная загвоздка.

  Ответить  
 
 автор: Trianon   (28.02.2010 в 00:21)   письмо автору
 
   для: durable   (28.02.2010 в 00:18)
 

В php естественно ставить имена полей как массивы:
<input type="text" name="id[1]" value="0" />
<input type="text" name="id[2]" value="0" />
Тогда имя id поля оказывается известным без перебора.

  Ответить  
 
 автор: sl1p   (28.02.2010 в 01:21)   письмо автору
 
   для: durable   (28.02.2010 в 00:18)
 

ну потом както так наверное
<?
$res 
mysql_query("SELECT id FROM table WHERE id_user='{$_user_id}' AND id_tovar IN(".implode(","$_POST['id_tovar']).")");
$items_exist = array();
if(
mysql_num_rows($res))
    while(
$r mysql_fetch_row($res))
        
$items_exist[] = $r[0];
foreach(
$_POST['id_tovar'] as $id) {
    if(
in_array($id$items_exist)) {
        
// update++
    
} else {
        
// insert new item
    
}
}

  Ответить  
 
 автор: Trianon   (28.02.2010 в 01:32)   письмо автору
 
   для: sl1p   (28.02.2010 в 01:21)
 

так напрямую нельзя.
инъекция.

  Ответить  
 
 автор: sl1p   (28.02.2010 в 01:42)   письмо автору
 
   для: Trianon   (28.02.2010 в 01:32)
 

ну тогда так :)
<?
$_POST
['id_tovar'] = array_map('intval'$_POST['id_tovar']);
$res mysql_query("SELECT id FROM table WHERE id_user='{$_user_id}' AND id_tovar IN(".implode(","$db_id_tovar).")");
$items_exist = array();
if(
mysql_num_rows($res))
    while(
$r mysql_fetch_row($res))
        
$items_exist[] = $r[0];
foreach(
$_POST['id_tovar'] as $id) {
    if(
in_array($id$items_exist)) {
        
// update++
    
} else {
        
// insert new item
    
}
}

  Ответить  
 
 автор: Trianon   (28.02.2010 в 01:47)   письмо автору
 
   для: sl1p   (28.02.2010 в 01:42)
 

примерно так.

PS. чем Вам $_user_id не угодил? Он наверняка такой же целый...

  Ответить  
 
 автор: sl1p   (28.02.2010 в 02:42)   письмо автору
 
   для: Trianon   (28.02.2010 в 01:47)
 

это я просто скопировал чейто пост с запросом :) не заметил :)

да и тут ещё невнимательность сыграла:

$res = mysql_query("SELECT id FROM table WHERE id_user='{$_user_id}' AND id_tovar IN(".implode(",", $_POST['id_tovar']).")");

  Ответить  
 
 автор: durable   (01.03.2010 в 08:37)   письмо автору
 
   для: sl1p   (28.02.2010 в 02:42)
 

Спасибо, за подробное разъяснение!

  Ответить  
 
 автор: durable   (15.04.2010 в 12:20)   письмо автору
 
   для: durable   (01.03.2010 в 08:37)
 

Вот что у меня получилось, может кому нибудь пригодится или кто нибудь что то подскажет:

<?
if($_POST)
{
$_POST['tovar']  = array_map('intval'$_POST['tovar']);
foreach (
$_POST['tovar'] as $key => $value)
{
    if (
$value 0$TovarZakaz[$key] = $value;
}
if (isset(
$TovarZakaz))
{
    
$sql_query "SELECT `cart_tovar` FROM `carts` WHERE `cart_user` = '".(int)$_SESSION['user_id']."' AND `cart_tovar` IN (".implode(',',array_flip($TovarZakaz)).")";
    
$sql_res=mysql_query($sql_query );
    
$TovarInCart = array();
    while (
$row mysql_fetch_row($sql_res)) $TovarInCart[] = $row[0];
    foreach(
$TovarZakaz as $key => $value
    {
        if(
in_array($key$TovarInCart)) 
        {
            
$sql_query "UPDATE `carts` SET `cart_colvo` = cart_colvo + ".$value." WHERE `cart_tovar` = '".$key."' AND `cart_user` = '".$_SESSION['user_id']."'";
            
mysql_query($sql_query );
        } 
        else 
        {
            
$sql_query "INSERT INTO `carts` VALUES ('', '".$_SESSION['user_id']."', '".$key."', '".$value."')";
            
mysql_query($sql_query );
        }
    }
   
// Далее высчитываю количества товара в корзине всего и сумму в корзине и сохраняю в сессию что бы не делать запросы в базу на каждой странице сайта
    
header("Location: ".$_SERVER['HTTP_REFERER']);
    
} else echo 
"Необходимо указать положительное число количества хотя бы для одного товара из списка.";
?>

  Ответить  
Rambler's Top100
вверх

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