|
|
|
| Предположим надо сделать виртуальную корзину (как в интернет магазинах) простенькую (для начала):при закрытии окна браузера выбранные, но оформленные в покупку товары в ней не оставались, с использованием соответственно баз данных. Каков вообще оптимальный алгоритм для такой задачи? | |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 10:04)
| | Используй готовое решение, никто не будет тебе помогать на себе проверил короче ничего у тебя не получится:
Есть класный магазин "Shop-Script PREMIUM". нинимум знаний при установке максимум при эксплуатации, меняеш дизайт и все тип топ.
А ответ на твой вопрос корзина на ява скрипт, страница не перерисовывается каждый раз при добавлении товара в корзину. | |
|
|
|
|
|
|
|
для: tetris-x
(21.06.2005 в 10:55)
| | Меня не интересует готовое решение, меня интересует ОПТИМАЛЬНЫЙ алгоритм. Хочу знать как правильно это делать. И:
1) всё у меня получится (т.к. у самого идей полно);
2) на этом форуме в беде никогда не бросают. ПРОВЕРЕНО! | |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 11:07)
| | Могу только позавидовать твоему оптимизму.
Ну раз все у тебя получится желаю удачи и ботыстрее найти ответ на твой вопрос. | |
|
|
|
|
|
|
|
для: tetris-x
(21.06.2005 в 12:34)
| | Ну, что? А ты говорил, что здесь никто никогда не отвечает. | |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 10:04)
| | В этом случае разумнее инициировать сессию и хранить выбранные товары в $_SESSION в виде двумерного массива - в этом случае будет проще отслеживать число и вид выбранных товаров, без дополнительных запросов в MySQL (можно хранить только первичный ключи товарных позиций). При переходе в "корзину" можно отображать покупателю форму с выбранными товарными позициями и возможность отредактировать условия покупки - изменить число товаров и убрать лишние товарные позиции, которые были выбраны случайно или на которые не хватает денег (там же должна выводится общая сумма). Заносить заказ в базу данных только при подтверждении покупателем того, что он осуществляет покупку. Это приведёт к тому, что не оформленные товарные позиции исчезнут из корзины как только покупатель закроет окно браузера, но зато здорово разгрузит базу данных, так как не придётся постоянно обращаться к таблицам и самое главное осуществлять дорогостоящий по времени запрос с участием оператора UPDATE. | |
|
|
|
|
|
|
|
для: cheops
(21.06.2005 в 12:31)
| | Спасибо за совет. Думаю в процессе создания корзины у меня появятся новые вопросы. | |
|
|
|
|
|
|
|
для: cheops
(21.06.2005 в 12:31)
| | Может быть есть у кого-нибудь готовый примерчик, а то я совсем запутался. | |
|
|
|
|
 91.9 Кб |
|
|
для: ms.Net
(21.06.2005 в 15:40)
| | лови | |
|
|
|
|
|
|
|
для: P@Sol
(21.06.2005 в 16:04)
| | Спасибо, что не бросили. Сейчас буду анализировать. | |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 16:11)
| | если есть вопросы задавай;) или если есть возможность, то скрипт из книги http://www.bolero.ru/product-31194244.html?terms=PHP | |
|
|
|
|
|
|
|
для: P@Sol
(21.06.2005 в 16:24)
| | Что-то много лишнего в этом скрипте. В каких именно файлах находится обработчик добавления в корзину. | |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 16:39)
| | show_kart.php отображает содержимое карзины. используеться для добавления элементов в карзину
checkout.php - представляет все данные пользователю. принимает данные по доставке
purchase.php - принимает информацию по платежу
process.php - обрабатывает данные платежа и добавляет заказ а бд
order_fns.php - набор функций хранения и извлечения данных заказа | |
|
|
|
|
|
|
|
для: P@Sol
(21.06.2005 в 16:24)
| | Надо делать самому. Быстрее получится, тем более мне нужна самая простая корзина.
Надо сделать по методу который посоветовал cheops. При выборе, предположим книги, заносим id товара в массив Korzina (который будет инициализирован сессией), с помощью функции array_pad. Далее если человек захочет просмотреть корзину все данные оттуда достаём. После оформления заказа всё кидаем в БД. Господа проффесионалы правильно хоть мыслю? Может где поправить меня надо? | |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 16:51)
| | в show_cart.php тоже в сессию сохраняют массив | |
|
|
|
|
|
|
|
для: P@Sol
(21.06.2005 в 16:24)
| | Давай попробуем разобраться с файлом show_cart.php
<?
//это в принципе понятно
include ('book_sc_fns.php');
// The shopping cart needs sessions, so start one
//стартуем сессию
session_start();
//ЗА ЧТО ОТВЕЧАЕТ ЭТА ПЕРЕМЕННАЯ? Видимо за то заново корзина набивается
//или продолжает
if($new)
{
//new item selected
//если ещё не создан массим cart (видимо где хранится инфа о выбранном товаре)
if(!session_is_registered("cart"))
{
//Что это за массив? Тот где всё храним?
$cart = array();
session_register("cart");
//???
$items = 0;
session_register("items");
//???
$total_price = "0.00";
session_register("total_price");
}
//Дальше вообще не понятно. Поясните пожалуйста комментариями если
//есть пару минут свободных
if($cart[$new])
$cart[$new]++;
else
$cart[$new] = 1;
$total_price = calculate_price($cart);
$items = calculate_items($cart);
}
if($save)
{
foreach ($cart as $isbn => $qty)
{
if($$isbn=="0")
unset($cart[$isbn]);
else
$cart[$isbn] = $$isbn;
}
$total_price = calculate_price($cart);
$items = calculate_items($cart);
}
do_html_header("Your shopping cart");
if($cart&&array_count_values($cart))
display_cart($cart);
else
{
echo "<p>There are no items in your cart";
echo "<hr>";
}
$target = "index.php";
// if we have just added an item to the cart, continue shopping in that category
if($new)
{
$details = get_book_details($new);
if($details["catid"])
$target = "show_cat.php?catid=".$details["catid"];
}
display_button($target, "continue-shopping", "Continue Shopping");
$path = $PHP_SELF;
$path = str_replace("show_cart.php", "", $path);
display_button("https://".$SERVER_NAME.$path."checkout.php", "go-to-checkout", "Go To Checkout");
do_html_footer();
?>
|
| |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 17:05)
| | >Давай попробуем разобраться с файлом show_cart.php
<?
//это в принципе понятно
include ('book_sc_fns.php');
// The shopping cart needs sessions, so start one
//стартуем сессию
session_start();
//если корзины нет, надо ее создать;)
if($new)
{
//new item selected
//если ещё не создан массим cart (видимо где хранится инфа о
выбранном товаре)
if(!session_is_registered("cart"))
{
//в этом массиве храним добавленные элементы
$cart = array();
session_register("cart");
//думаю, это кол-во товара
$items = 0;
session_register("items");
//итоговая цена
$total_price = "0.00";
session_register("total_price");
}
//если содержиться элемент, то кол-во увеличиваем на один
if($cart[$new])
$cart[$new]++;
else
$cart[$new] = 1;
//определяем общую сумму заказа (функция calculate_price из файла book_fns)
$total_price = calculate_price($cart);
//общее количество заказанного товара
$items = calculate_items($cart);
}
//сохраняем изменения
if($save)
{
foreach ($cart as $isbn => $qty)
{
if($$isbn=="0") //перепираем все элементы тележки и для каждой переменной $isbn (номер книги) проверяется значение переменной с соответствующим именем
unset($cart[$isbn]); //если в любом поле устанавливаеться значение 0, соответствующий элемент удаляется
else //обновляем содержимое тедежки
$cart[$isbn] = $$isbn;
}
$total_price = calculate_price($cart); //новые значения цены и кол-ва
$items = calculate_items($cart);
}
//вывод на экран
do_html_header("Your shopping cart"); //шапка
if($cart&&array_count_values($cart))
display_cart($cart); //выводим результат
else //тележки нет
{
echo "<p>There are no items in your
cart";
echo "<hr>";
}
$target = "index.php";
// if we have just added an item to the cart, continue
shopping in that category
if($new)
{
$details = get_book_details($new);
if($details["catid"])
$target =
"show_cat.php?catid=".$details["catid"];
}
//вывод кнопок
display_button($target, "continue-shopping",
"Continue Shopping");
$path = $PHP_SELF;
$path = str_replace("show_cart.php",
"", $path);
display_button("https://".$SERVER_NAME.$path."checkout.php",
"go-to-checkout", "Go To Checkout");
do_html_footer(); //вывод низа
?>
|
| |
|
|
|
|
|
|
|
для: ms.Net
(21.06.2005 в 17:05)
| | Я тут написал кое-что. Почему не работает. Помогите!
<?
Error_Reporting(E_ALL & ~E_NOTICE);
session_start();
$_SESSION['cart[]'];
?>
<html>
<body>
<table>
<tr><td><a href="sost.php?id=1">Добавить товар 1</a></td></tr>
<tr><td><a href="sost.php?id=2">Добавить товар 2</a></td></tr>
<tr><td><a href="sost.php?id=3">Добавить товар 3</a></td></tr>
<tr><td><a href="sost.php?id=4">Добавить товар 4</a></td></tr>
<tr><td><a href="sost.php?id=5">Добавить товар 5</a></td></tr>
<tr><td><a href="sost.php?id=6">Добавить товар 6</a></td></tr>
<tr><td><a href="sost.php">Посмотреть корзину</a></td></tr>
</table>
</body>
</html>
|
И второй файлик:
<?
Error_Reporting(E_ALL & ~E_NOTICE);
session_start();
if ((count($cart)>0))
{
$tmp=$_GET['id'];
$cart=array_push($cart,$tmp);
foreach ($cart as $id_index=>$id_tovar)
{
echo "<p>В корзине товар ".$id_tovar."</p>";
}
echo "<a href=korzina.php>Вернуться</a>";
}
else "<p>В корзине нет товаров</p>";
?>
|
Пишет ошибки:
Warning: array_push(): First argument should be an array in X:\home\localhost\www\kor\sost.php on line 8
Warning: Invalid argument supplied for foreach() in X:\home\localhost\www\kor\sost.php on line 9 | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 11:07)
| | что то ему не нравиться $cart как первый аргумент array_push....он у тебя объявлен массивом? | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 11:21)
| | Как быть? | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 11:25)
| | $cart=array(); попробуй....откуда у тебя береться значение $cart?
$_SESSION['cart[]']; по-моему надо исправить на $_SESSION['cart']; | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 11:26)
| | Как в сессиях регистрировать массив? Дайте плиз пример | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 12:41)
| |
$cart = array();
session_register("cart");
|
| |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 12:41)
| | Вот кусок кода:
session_start();
$cart = array();
session_register("cart");
---------------------------------
$tmp=$_GET['id'];
array_push($cart,$tmp);
foreach ($cart as $id_tovar)
{
echo "<p>В корзине товар".$id_tovar."</p>";
}
|
Вроде всё так! Только при повторном заходе на страницу он зн-я предыдущего id не запоминает. Есть идеи? | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 12:49)
| | да, ты не добавляешь этот товар в массив | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 12:54)
| | Нет, tmp приходит. $cart получает его значение и выводится результат что товар $tmp положен в корзину, я возвращаюсь на страницу выбираю просмотр корзины и он пишет что там ничего нет. Т.е. он не хранит $cart. | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 12:54)
| | $cart[$id_tovar] = $$id_tovar; | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 12:58)
| | А что за $id_index? | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 12:58)
| | И к чему это? | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 13:01)
| | Я разобрался. Дело в том, что при каждом обращении к этой странице он заново из регистрирует и создает новый массив. УЧИТЬСЯ, УЧИТЬСЯ и ещё раз УЧИТЬСЯ. | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 13:07)
| | да...и это тоже:) | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 13:01)
| | чтобы сохранить товар, его нужно положить в массив...
if($save) //если надо сохранить
{
foreach ($cart as $isbn => $qty)
{
if($$isbn=="0")
unset($cart[$isbn]);
else
$cart[$isbn] = $$isbn; // добавляем значение в массив
}
$total_price = calculate_price($cart); //пересчитываем цену
$items = calculate_items($cart); //пересчитываем кол-во
}
|
| |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 13:07)
| | А так array_push($cart,$tmp); | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 13:13)
| | я сглупил...извини..правельно..и что у тебя получилось? | |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 13:20)
| | Вот полный код. id приходит из другой страницы. Сессии тоже создаются там. Всё равно почему-то не сохраняет значения массива $cart
<?
Error_Reporting(E_ALL & ~E_NOTICE);
session_start();
//$cart = array();
//$_SESSION['cart'];
$proverka=0;
if ($_GET['id']<>0)
{
if ((count($cart)>0))
{
$tmp=$_GET['id'];
//ïðîâåðêà íà óæå ïîëîæåííûé òîâàð
foreach ($cart as $id_tovar)
{
if ($id_tovar==$tmp) $proverka=1;
}
if ($proverka<>1) $cart[]=$tmp;
//âûâîä êîðçèíû
foreach ($cart as $id_tovar)
{
echo "<p>Â êîðçèíå òîâàð ".$id_tovar."</p>";
}
echo "<p><a href=korzina.php>Âåðíóòüñÿ</a></p>";
echo "<p><a href=korzina_del.php>Î÷èñòèòü êîðçèíó</a></p>";
echo "<p>Âñåãî òîâàðîâ â êîðçèíå: ".count($cart)." øò.</p>";
};
//åñëè êîðçèíà áûëà ïóñòà
if ((count($cart)==0))
{
echo "<p>åñëè êîðçèíà áûëà ïóñòà</p>";
// $cart[$id_index] = $$id_index;
$tmp=$_GET['id'];
//array_push($cart,$tmp);
$cart[]=$tmp;
foreach ($cart as $id_tovar)
{
echo "<p>Â êîðçèíå òîâàð ".$id_tovar."</p>";
}
echo "<p><a href=korzina.php>Âåðíóòüñÿ</a></p>";
echo "<p><a href=korzina_del.php>Î÷èñòèòü êîðçèíó</a></p>";
echo "<p>Âñåãî òîâàðîâ â êîðçèíå: ".count($cart)." øò.</p>";
}
}
if (($_GET['id']==0) and (count($cart)==0))
{
echo "<p>Êîðçèíà ïóñòà</p>";
echo "<a href=korzina.php>Âåðíóòüñÿ</a>";
}
if (($_GET['id']==0) and (count($cart)<>0))
{
foreach ($cart as $id_tovar)
{
echo "<p>Â êîðçèíå òîâàð ".$id_tovar."</p>";
}
echo "<a href=korzina.php>Âåðíóòüñÿ</a>";
}
// else echo "<p>Â êîðçèíå íåò òîâàðîâ!</p>";
?>
|
| |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 13:23)
| | Вы должны уже пользоваться массивом $_SESSION['cart'][], хотя помоему с массивами не получиться работать с сессиями. | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 13:23)
| |
<?
session_start();
$new=$_GET['new'];
$cart=$_SESSION["cart"];
if ($cart="") $cart = array("1","2");
for ($i=0;$i<count($cart);$i++)
echo $cart[$i]." до добавления<br>";
if($new)
{
if(!$_SESSION["cart"])
{
session_register("cart");
}
$cart=array_push($cart,$new);
}
for ($i=0;$i<count($cart);$i++)
echo $cart[$i]." после<br>";
?>
|
вот такой код...но он тоже не работает...если его получиться отладить...то Ваш тоже должен будет заработать;)
вот, я думаю этот более правельный, но все равно пока нерабоочий
<?
session_start();
$new=$_GET['new'];
if($new)
{
if(!$_SESSION[cart])
{
session_register("cart");
}
$cart=$_SESSION[cart];
if ($cart[0]="") $cart = array("1","2");
for ($i=0;$i<count($cart);$i++)
echo $cart[$i]." до добавления<br>";
$cart=array_push($cart,$new);
for ($i=0;$i<count($cart);$i++)
echo $cart[$i]." после<br>";
}
?>
|
| |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 14:04)
| | добавляет первый $new в массив, и потом можно добавить еще один...но он будет меняться
<?
session_start();
$new=$_GET['new'];
if($new)
{
if(!$_SESSION[cart])
{
$cart=array();
session_register("cart");
}
$cart=$_SESSION[cart];
if (count($cart)== 0) $cart = array("1","2");
for ($i=0;$i<count($cart);$i++)
echo $cart[$i]." до добавления<br>";
array_push($cart,$new);
for ($i=0;$i<count($cart);$i++)
echo $cart[$i]." после<br>";
}
?>
|
| |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 12:49)
| | почитал книгу...вот что надо
if($new)
{
if(!session_is_registered("cart"))
{
$cart = array();
session_register("cart");
}
if($cart[$new])
$cart[$new]++;
else
$cart[$new] = 1;
}
|
| |
|
|
|
|
|
|
|
для: P@Sol
(22.06.2005 в 13:26)
| | Лучше использовать суперглобальный массив $_SESSION, так как функции session_register() и session_is_registered() считаются устаревшими.
<?php
if(!isset($_SESSION['cart']))
{
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(22.06.2005 в 13:31)
| | Напишите пожалуйста самый примитивный пример. Как сохранять и читать в массив с помощью сессий на нескольких страницах. | |
|
|
|
|
|
|
|
для: ms.Net
(22.06.2005 в 14:08)
| | Давайте в новую тему переберёмся, а то эта слишком длинная и с ней не удобно работать.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=4895 | |
|
|
|