[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопросы по реализации корзины покупок
Хиросим
Здравствуйте, уважаемые.
Я опять уперся, как не прискорбно.

Есть два вопроса по реализации корзины покупок:
1. "Покупочная"ссылка из каталога товаров выглядит следующим образом:
<a href='basket.php?add=%s&price=%s&j=заправка'>Положить в корзину</a>
передаю три переменные (идентификатор товара, цену, и ещо одну примочку) , на их основании формируется массив, который выводится в файле basket.php. Тут все нормально, но зайдя в очередной раз по указанной ссылке, переменные фиксируются в адресной строке и, если, по какой либо причине, пользователь обновит корзину, то функция воспримет это как повторное нажатие на кнопку заказа и прибавит еще одну единицу товара. Помогите разобраться как мне организовать ссылку, чтобы не покидать каталог товара, а данные при этом передавались в файл-обработчик и там соответственно обрабатывались. Либо другой вариант - как сделать чтобы при переходе в файл обработчик удалять переменные из адресной строки.???
2. Пересчет товара я организовал воттак

<?php
do
{
printf (
"<form action="basket.php" method="post"><table class='element'>
<tr>
<td class='element_basket'><a href=cartridge.php?id=%s>%s %s</a></td>
<td>%s</td>
<td class='element_basket'>%s</td>
<td class='element_basket'><INPUT name=id TYPE=hidden value=%s><INPUT name=col TYPE=text size=1 value=%s><INPUT TYPE=submit NAME=modify value=Пересчитать></td>
<td class='element_basket'>%s</td>
<td class='element_basket'>
$sum</td>
</tr>
</table></form>"
,
$shopping["id_product"],$shopping["brend"],$shopping["art"],$shopping["color"],$shopping["type_j"],$shopping["id"],$shopping["quantity"],$shopping["price"]);
}
while ($shopping= mysql_fetch_array($result_shopping));
?>


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



Спустя 6 минут, 30 секунд (30.03.2010 - 12:36) ApuktaChehov написал(а):
Чёто тут поповщиной попахивает.

Ну, вроде как, товары хранят в куках(id товара и кол-во). Если юзер позже вернется, то все его покупки сохраняются. Еще можно в БД хранить, но это по ситуации нужно смотреть.

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

Спустя 5 минут, 14 секунд (30.03.2010 - 12:41) Хиросим написал(а):
И еще забыл. Если я организовал корзину на сессиях, как мне определить что пользователь закрыл браузер и сессия закончена???? и можно очистить таблицу корзины по данной сессии (если пользователь просто накидал товар, но не оформил заказ)????

Спустя 23 секунды (30.03.2010 - 12:41) Архуша написал(а):
А зачем передавать и цену? Можно передавать только ИД, а корзина уж формируется за счет суммы товара по ИД.

Я корзину делал следующем образом:
1) В каталоге можно было указывать какое количество товара тебе надо
2) человек указывал количество товара нажимал положить (я делал через jquery соответсвенно данные отправлялись на сервер и див с ценой корзины обновлялся.) При этом была обработка, что если человек еще раз нажимал, то скрипт на сервере проверял, если есть такой товар в корзине, то добавлять не новую позицию в корзину а прибавлять указанное количество к имеющимуся в корзине.
3) ПО поводу очистки, могу посоветовать делать следующим образом: человек нажал "положить в корзину" он пересылается на страницу с надписью: Товар такой то успешно добавлен в корзину и через javascript отброс обратно (с задержкой в секунд 5).

по поводу пересчета не врубился что требуется...

Спустя 8 минут, 56 секунд (30.03.2010 - 12:50) Архуша написал(а):
Цитата (Хиросим @ 30.03.2010 - 09:41)
И еще забыл. Если я организовал корзину на сессиях, как мне определить что пользователь закрыл браузер и сессия закончена???? и можно очистить таблицу корзины по данной сессии (если пользователь просто накидал товар, но не оформил заказ)????

ну здесь стандартно. smile.gif Когда пользователь ходит по страницам в таблицу online пиши его ses_id и время когда он прошел по странице.

Соответсвенно онлайн пользователей ты считаеш следующим образом:
Береш таблицу, смотриш по сессии время, к этому времени прибавляй минут 5. Смотриш если полученная сумма все равно меньше текущего времени, то человек с сайта ушел.

Так и определяеш.

Спустя 14 минут, 37 секунд (30.03.2010 - 13:05) Хиросим написал(а):
Цитата
А зачем передавать и цену? Можно передавать только ИД, а корзина уж формируется за счет суммы товара по ИД.

у меня для каждого товара две цены.

Потом я пока чайник (надеюсь это временно) и яваскрипты с jquery пока не изучал, стандартными средствами PHP и HTML хотелось бы попробовать решить.

Цитата
по поводу пересчета не врубился что требуется...

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

по остальному спасибо!!

Спустя 45 минут, 42 секунды (30.03.2010 - 13:51) Архуша написал(а):
По поводу двойной цены, то тоже проблемы не вижу. Человек же не сам ее выбирает, а она выбирается на определенных основаниях. Передавай данное основание через сессию (если это для каждого товара равносильно) и уже при занесение товара определяй какую цену нужно.

А то смотри умные покупатели будут сами формировать цены... Тем более ты GETом передаеш...

По поводу пересчета делаеш следующим образом:
У тебя каждая единица товара храниться в таблице заказов (с привязкой к пользователю).
При отображение корзины, выводиш из таблицы данные приблизительно так:

$i=0;
$sql="SELECT * FROM `korzina` WHERE `user_id`='".$user_id."'";
$query_korzina=mysql_query($sql);
while($korzina=mysql_fetch_array($query_korzina))
{
echo $korzina['name'].' <input name="tovar_'.$i.'" value="'.$korzina['id'].'" type="hidden"><input name="cena_'.$i.'" value="'.$korzina['cena1'].'" type="hidden"><input name="col_'.$i.'" value="'.$korzina['col'].'" type="text"><br> ';
$i++;
}
echo '<input type="hidden" name="col" value="'.$i.'">';
// дальше кнопка пересчитать
if (isset('$_POST['col']') and $_POST['col']!='0') // проверяем что товар вообще есть
{
for ($t=0; $t<=$_POST['col']; $t++)
{
$cena=$_POST['cena_'.$t]*$_POST['col_'.$t];
//далее заносим цену и количество в ячейки с товаром по тому же принципу.
}
}


На против каждого товара поле инпут где должны ввести количество товара.

Вообщем вот так вполне рабочий алгоритм.



Спустя 1 час, 1 минута, 2 секунды (30.03.2010 - 14:52) Хиросим написал(а):
Во... спасибо!!! буду разбираться...
а цену всетаки покупатель выбирает, у меня на самом деле не товар а услуга, для одного артикула можно два вида работ сделать, покупатель сам решает какой именно, но это мелочи..

Спустя 23 минуты, 4 секунды (30.03.2010 - 15:15) ApuktaChehov написал(а):
Советую воздержаться от передачи цен каким либо образом.
Если произойдет взлом, то злоумышленник сможет вашим товарам или услугам задавать произвольные цены. Я конечно понимаю, что это только на уровне сайта и заказ стоимостью 1 руб. вы выполнять не будете. В любом случае, это приведет к неприятностям, которые решать придется Вам.

По этому настоятельно рекомендую цены хранить в базе данные, и не передовать их ниоткуда.

Случай из жизни.

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

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

Я правда не знаю, чем все это закончилось, удалось ли ему доказать, что его обманули, или нет. Но проблемы были и у фирмы и у клиента.

По этому будьте внимательнее!

Спустя 3 часа, 27 минут, 42 секунды (30.03.2010 - 18:42) Хиросим написал(а):
Опять таки спасибо, учту.
Еще один вопрос возник...
Уже по событиям onClick и onBlur.
хочу поставит переключатели для выбора предпочтительной формы оплаты (input type=radio) один "наличные" второй соответственно "безнал"
и хочу чтобы при установке на "безнал" активировались поля формы для ввода реквизитов, которые по умолчанию disabled. Так вот как оживить одно поле я разобрался

<input type="radio" name="nal" onFocus="this.form.inn.disabled=1" checked> Наличные<Br>
<input
type="radio" name="nal" onFocus="this.form.inn.disabled=0"> Безналичный расчет<Br>
<input
type="text" name="inn" size="40" disabled><br>

А возможно таким образом на несколько полей влиять?????

Спустя 26 минут, 14 секунд (30.03.2010 - 19:09) ApuktaChehov написал(а):
Сделайте проще.
Создайте слой, куда засуньте все поля для реквизитов. Слою в стиле задайте display: none;

А при выборе безнала, сделайте так: слой.style.display = "block";

И он у вас появится со всеми вашими реквизитами.

Вот...

Спустя 37 минут, 22 секунды (30.03.2010 - 19:46) Хиросим написал(а):
)))) для меня слои совсем не проще)))..
но всерно спасибо за совет, сожусь изучать яву со слоями.....

Спустя 1 час, 3 минуты, 1 секунда (30.03.2010 - 20:49) ApuktaChehov написал(а):
Да там все просто.
function ura()
{
var div = document.getElementById('div');
div.style.display = 'block';
}

<div style="display: none;" id="div">что то</div>
<button
onClick="ura();" value="Жми">


Реально. Без слоев будет почти невозможно что либо сделать интересное. Это основа основ.

Спустя 1 день, 9 часов, 45 минут, 31 секунда (1.04.2010 - 06:35) Хиросим написал(а):
ыыыыыыыыыы biggrin.gif )))
ApuktaChehov... большой спасиб.... скачал несколько справочников по яве... всё грусно.. если выучу их наизусть может и пойму ченить...
решил пойти другим путем.. методом научного тыка впихнул твой скриптик в свою страницу... все работает, и отображается мой блок и исчезает, все как планировалось, я аж спать перехотел))))
вопрос - можешь порекомендовать толковое чтиво по этой теме... ну я имею ввиду без "жаргона"... для нас, для особо одаренных чтоб понятно было))))???

Спустя 1 час, 9 минут, 12 секунд (1.04.2010 - 07:44) Хиросим написал(а):
Воблин.. доигрался....
Перестала работать функция добавления записи в таблицу бд. Причем работал только с яваскриптами... могли ли они изменить какие либо настройки PHP???
Потомучто откатил все изменения файла в исходное состояние. всеравно не работает....

вот мои функции отображения/скрытия блока
function ura()
{
var div = document.getElementById('div');
div.style.display = 'block';
}
function ura1()
{
var div = document.getElementById('div');
div.style.display = 'none';
}


Вот мои переключатели отображения блока
<input type='radio' name='nal' checked onClick='ura1();'> Наличные<br>
<
input type='radio' name='nal' onClick='ura();'> Безналичный расчет<br>


а вот функция проверки заполнения формы:
function check_form(form1){
if(form.inn.value==''){
alert('Необходимо заполнить поле "ИНН"!');
form.name.focus();
return false;


Спустя 35 минут, 1 секунда (1.04.2010 - 08:19) ApuktaChehov написал(а):
А что не работает то? JS на PHP на прямую повлиять не может. Скрипт на PHP покажи.

Ничего порекомендовать не могу, так как почти ничего не читал про JS.
Вот по PHP могу, если надо.

Спустя 56 минут, 11 секунд (1.04.2010 - 09:15) Хиросим написал(а):
Чудеса, скопировал все теже файлы на ноутбук, с мелкими косяками но все работает.. вот код:
Ссылка на файл basket

<td class='elementposition'><a href='basket.php?add=%s&j=1'><img src='Img/buttonz1.gif' name='Image5' width='100' height='25' border='0'></a></td>


Вызов функции добавления товара в файле basket:
<?php
if (isset ($_GET['add']))
{
$product = $_GET['add'];
$j = $_GET['j'];
add_item($session,$product, 1, $j);
}
?>


Сама функция:

<?php
function
add_item($session,$product,$quantity,$type_j)
{
// Проверка наличия выбранного продукта в корзине
$in_list = "SELECT * FROM shopping WHERE session='$session' AND id_product='$product' AND type_j='$type_j'";
$result = mysql_query("$in_list");
$num_rows = mysql_num_rows($result);
$in_base = "SELECT * FROM bd1 WHERE id='$product'";
$result2 = mysql_query($in_base);
$row2 = mysql_fetch_array($result2);

if ($type_j == 1)
{
$price = $row2[price1];
}
else
{
$price = $row2[price2];
}

$art = $row2[art];
$brend = $row2[brend];
$color = $row2[color];


// Такого продукта нет, кладем его в корзину
if ($num_rows == 0)
{
$sql = "INSERT INTO shopping (session,id_product,quantity,art,price,brend,color,type_j) VALUES ";
$sql .= "('$session','$product','$quantity','$art','$price','$brend','$color','$type_j')";
mysql_query("$sql");
}
// Такой продукт уже есть – добавляем количество к существующему
else
{
$row = mysql_fetch_array($result);
$quantity = $quantity + $row[quantity];
$sql = "UPDATE shopping SET quantity='$quantity' WHERE session='$session' AND id_product='$product' AND type_j='$type_j'";
mysql_query("$sql");
}
}

?>


Спустя 36 минут, 24 секунды (1.04.2010 - 09:51) ApuktaChehov написал(а):
Так я не понял, работает все или нет?

А это что такое?
$price = $row2[price1];


Тогда уже так:
$price = $row2['price1'];

Спустя 4 минуты, 43 секунды (1.04.2010 - 09:56) Хиросим написал(а):
В опчем на основном компе этот скрипт добавляет в таблицы базы данных только одну позицию, ито при условии что таблица пустая. При добавлении последующих позиций - функция просто игнорируется без всяких ругательств и товар не добавляет...
Тот же самый скрипт установил на ноутбуке (где не проводил никаких манипуляций с яваскриптами).. там все работает нормально.

Спустя 8 минут, 50 секунд (1.04.2010 - 10:05) Хиросим написал(а):
Цитата
А это что такое?

Это был косяк.. поправил... но ничего не изменилось...

Спустя 1 минута, 23 секунды (1.04.2010 - 10:06) Хиросим написал(а):
А можно как нибудь посмотреть журнал изменения настроек в PHP????

Спустя 10 минут, 2 секунды (1.04.2010 - 10:16) Хиросим написал(а):
В опчем пытаюсь вручную в phpmyadmin добавить строку в таблицу, выдает ошибку
#1062 - Duplicate entry '127' for key 1

127 это номер id единственного существующего элемента в таблице, причем при попытке ручного ввода id я не задаю, у него автоинкремент установлен....

Спустя 12 минут, 49 секунд (1.04.2010 - 10:29) Хиросим написал(а):
Я БАРАН.... признаю, и за отход от темы простите!!!
у поля ID в базе был тип tinyint, он до 128 считает...
сам не пойму как влепил...


Спустя 40 секунд (1.04.2010 - 10:30) ApuktaChehov написал(а):
Для начала добавь ко всем запросам
or die (mysql_error());


вот так:
mysql_query($in_base) or die (mysql_error());


будет видно что и как.

Спустя 30 минут, 49 секунд (1.04.2010 - 11:01) Хиросим написал(а):
С косяком разобрался но страдания не закончились

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

Спустя 12 минут, 25 секунд (1.04.2010 - 11:13) ApuktaChehov написал(а):
С сайтом тут видимо профилактика, а писать так забавно.
Ну, твой вопрос решается просто.
Когда проверяешь форму на заполнения, блок, в котором проверяем поля в скрывающем слое, нужно загнать в условие:

if(слой.style.display == 'block')
}
а тут все проверяется.
}

Фуф отредактировал wink.gif

Спустя 42 минуты, 55 секунд (1.04.2010 - 11:56) Хиросим написал(а):
ApuktaChehov
Спасибо тебе огромное, все работает....
теперь буду разбираться с отправкой почты... но это уже в другой теме будет))))

Спустя 4 минуты, 45 секунд (1.04.2010 - 12:01) ApuktaChehov написал(а):
Всегда пожалуйста!

Спустя 10 месяцев, 27 дней, 11 часов, 28 минут, 12 секунд (1.03.2011 - 00:29) Guest написал(а):
biggrin.gif rolleyes.gif tongue.gif blink.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.