| |
|
|
| | Доброго времени суток.
Прошу оказать посильную помощь в создании корзины. Ознакомился с темами на форуме ( около 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
(18.04.2007 в 17:18)
| | | Пооомогиите пожалуйста, товарищи программисты ! | |
| |
|
|
| |
|
|
| |
для: 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 <= 0 || intval($kolvo) != $kolvo)
die('Некорректное значение в поле количества товара');
$kolvo = intval($kolvo);
@$id_tov = $_POST['id_tovara'];
if($kolvo <= 0 || 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 шт.";
|
| |
| |
|
|
| |
|
|
| |
для: Trianon
(19.04.2007 в 10:24)
| | | Я бы не взялся писать собственный магазин с нуля, основываясь только на прочитаных темах форума и задавая на форуме вопросы. Это довольно объемная тема. Я в свое время купил учебник, где пошагово растолковывалось, как магазин реализовать, давался комментированный код, а на дискете был этот же готовый код магазина. После такого обучения уже можно писать свой код со своими идеями реализации. Хотя, может, у меня просто не так много мозгов...
[поправлено модератором] | |
| |
|
|
| |
|
|
| |
для: coloboc66
(19.04.2007 в 10:48)
| | | Просто у каждого свой подход к обучению :)
Готов согласиться с тем, что в теме имеются подводные камни (и довольно острые).
Касаются они в основном стадии расчета с покупателем.
В этом ключе я обычно стараюсь ничего непроверенного не советовать.
В остальном же тема как тема... Довольно хорошо подходит для иллюстрации разных приемов и принципов. Почему бы и нет? | |
| |
|
|
| |
|
|
| |
для: provodnik
(18.04.2007 в 17:18)
| | | Trianon , спасибо, но это немного не то. Вы мне привели пример, при случае, когда "Работа с корзиной возможна только после регистрации". Хотелось бы наоборот - дать пользователю возможность выбирать товар, а уже в итоге, при просмотре им своей корзины и подтверждения покупки, спрашивать его данные и заносить в БД.
У меня вопросы при работе с сессиями. Т.е.:
1. Не понимаю, нужно ли стартовать сессии на страницах с общим каталогом или же только на страницах, где есть форма с кнопкой "добавить в корзину"?
2. Проблема с синтаксисом при добавлении данных (id товара => количество) в массив в сессию
3. Проблема с работой с этим массивом: чтение данных, выборка из него.
4. Вопрос про оптимальное количество физических файлов. Т.е. у меня сейчас есть 1 файл (catalog.php) с подробным описанием товара и кнопкой добавления в корзину. И 1 файл (sbuy.php), который будет "файлом крзины". Будет добавлять данные в массив сессии, пересчитывать количество и общую стоимость, удалять товар из корзины и при подтверждения покупки выводить форму для запроса данных покупателя, для последующего занесения их в БД и отправкой "сигнала" менеджеру. Как оптимальнее рассчитать структуру?
5. Если не инициировать сессию на всех страницах каталога, не потеряются ли данные корзины?
И вот в каком файле что делать с сессиями, никак не разберусь. То у меня ничего не добавляется в массив, то наоборот, при обновлении страница данные в массиве дублируются...
coloboc66 - Я бы не взялся писать собственный магазин с нуля.
Я противоположного мнения. Учусь (и довольно успешно) с помощью этого форума, читая массу тем уже созданных и задавая новые вопросы. Дело в том, что у меня около 15 учебников по PHP, Mysql. правда в электронном виде. Но к сожалению я не всегда там нахожу необходимые ответы...
Заранее спасибо за ответы... | |
| |
|
|
| |
|
|
| |
для: provodnik
(19.04.2007 в 11:18)
| | | >Trianon , спасибо, но это немного не то. Вы мне привели пример, при случае, когда "Работа с корзиной возможна только после регистрации".
Это скорее для программиста строка - она означает лишь то, что переменная $id_user к этому моменту должна быть определена. Через сессии или еще как - не столь важно.
>Хотелось бы наоборот - дать пользователю
Это утверждение подразумевает, что работать с пользователями Вы умеете.
Собственно, на этом допущении и приводился код. Потому что если оно неверно - откладывайте задачу и решайте предыдущую.
>возможность выбирать товар, а уже в итоге, при просмотре им своей корзины и подтверждения покупки, спрашивать его данные и заносить в БД.
>
Уж коль скоро
Так будет даже проще. В этом случае корзину можно хранить в сессии.
Или в кукисах. Но в кукисах есть огранирчение на размер.
>У меня вопросы при работе с сессиями. Т.е.:
>1. Не понимаю, нужно ли стартовать сессии на страницах с общим каталогом или же только на страницах, где есть форма с кнопкой "добавить в корзину"?
Стартовать сессию нужно на той странице, где происходит переход от общего обслуживания к работе с конкретным пользователем. Или за страницу до этого.
>2. Проблема с синтаксисом при добавлении данных (id товара => количество) в массив в сессию
Какая?
>3. Проблема с работой с этим массивом: чтение данных, выборка из него.
Какая?
>4. Вопрос про оптимальное количество физических файлов.
Количество файлов скриптов и распеделение кода по ним может быть любым - лишь бы Вы не путались в коде. Обычно, когда каждая страница и каждый обработчик формы размещены в отдельном файле - в коде разбираться несколько легче. Но это вовсе не истина в последней инстанции.
>5. Если не инициировать сессию на всех страницах каталога, не потеряются ли данные корзины?
Если корзину хранить где?
В сессии? Тогда не потеряются, поскольку нечему будет теряться. Сложно вылить суп, не укупив кастрюлю.
В собственных кукисах - тем более не потеряются - сессия к ним не имеет отношения.
>И вот в каком файле что делать с сессиями, никак не разберусь. То у меня ничего не добавляется в массив, то наоборот, при обновлении страница данные в массиве дублируются...
Лучше говорить на конкретном примере. Я показал лишь код-обработчик. Код страницы с формой Вы не привели. | |
| |
|
|
| |
|
|
| |
для: 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);
$ar= mysql_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']); // переиндексируем значения индексов в сессии) - удаляется часть массива почему то...
Подскажите, стоит его вообще переиндексировать после удаления какого-нибудь индекса? или использовать как есть?
Спасибо за ответы. | |
| |
|
|