|
|
|
| Есть сайт с каталогом товаров, необходимо сделать для него корзину заказов.
Объясните пожалуйста логику работы с корзиной, т.к. сталкиваюсь с этим впервые.
Оформлять заказы могут только зарегистрированные пользователи, поэтому корзину буду хранить в базе данных, а не в сессии и не в кукисах, для того что бы при выходе пользователя состояние заказа сохранялось. Получается есть таблица в которой:
id (autoincrement)
id_user
id_tovar
colichestvo
И логика работы с корзиной (заказ нового товара в определенном количестве, редактирование корзины) мне тоже понятна.
Вот только не могу понять, как обработать систуацию когда пользователь добавляет в корзину товар, который в ней уже есть? | |
|
|
|
|
|
|
|
для: durable
(27.02.2010 в 11:35)
| | может что то вроде этого:
Когда пользователь нажимает "добавить товар", сначала делаем запрос к базе данных, не помню как записать, но что то типо того SELECT id FROM table WHERE id_user='ид пользователя' AND id_tovar = 'ид_товара'. Если такой товар у этого пользователя уже есть, то прибавляем 1 к colichestvo, если нет - добавляем новую строку в таблицу с новым товаром и количеством, равным 1 (либо сколько там выбрал пользователь) | |
|
|
|
|
|
|
|
для: sasha1133
(27.02.2010 в 11:56)
| | Дело в том, что на страницу будет выводиться до 50 позиций товара. Пользователь будет иметь возможность поставить напротив каждого товара количество и поместить его в корзину (заказ товара поставщику). Как например вот на этом сайте: http://www.elevel.ru/catalog/4177/
А по каждому из выбранных делать запрос в базу не хочется :-) | |
|
|
|
|
|
|
|
для: 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 (либо сколько там выбрал пользователь) | |
|
|
|
|
|
|
|
для: 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?
Вобщем вот именно в этом моменте главная загвоздка. | |
|
|
|
|
|
|
|
для: durable
(28.02.2010 в 00:18)
| | В php естественно ставить имена полей как массивы:
<input type="text" name="id[1]" value="0" />
<input type="text" name="id[2]" value="0" />
Тогда имя id поля оказывается известным без перебора. | |
|
|
|
|
|
|
|
для: 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
}
}
|
| |
|
|
|
|
|
|
|
для: sl1p
(28.02.2010 в 01:21)
| | так напрямую нельзя.
инъекция. | |
|
|
|
|
|
|
|
для: 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
}
}
|
| |
|
|
|
|
|
|
|
для: sl1p
(28.02.2010 в 01:42)
| | примерно так.
PS. чем Вам $_user_id не угодил? Он наверняка такой же целый... | |
|
|
|
|
|
|
|
для: 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']).")");
|
| |
|
|
|
|
|
|
|
для: sl1p
(28.02.2010 в 02:42)
| | Спасибо, за подробное разъяснение! | |
|
|
|
|
|
|
|
для: 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 "Необходимо указать положительное число количества хотя бы для одного товара из списка.";
?>
|
| |
|
|
|