|
|
|
| Здравствуйте,
Я стал писать магазин на сессиях и почти написал. В корзину добавляется товар таким образом: $_POST["new"] берется из скрытого поля в каталоге, потом пересылается в скрипт корзины.
if (isset($_POST["new"])) {
$new=$_POST["new"];
if(!$_SESSION["cart"])
{
$cart[]=$new;
$_SESSION["cart"] = $cart;
}
elseif ($_SESSION["cart"]) {
array_push($_SESSION["cart"],$new);
}
Далее выводится содержимое корзины, слева столбик "удалить". В нем радио кнопка для удаления этого элемента:
<td><input name='id' type='radio' value="<?=$i;?>" /></td>
Переменная $i служит, чтобы у разных радио кнопок был разный value и было удобно обращаться к ним через индексы массива.
Далее в форме есть кнопка "Пересчитать" такая:
<input type="submit" name="updbutton" value="Пересчитать" />
При нажатии на нее происходит сценарий получения id кнопки, который соответствует индексу в массиве:
if ($_POST["updbutton"]) {
//echo "OK <br>";
$id = $_POST["id"];
unset ($_SESSION["cart"][$id]);
....
}
Так вот у меня возникла ситуация, что если иногда происходит удаление этого элемента, но потом если продолжать набирать корзину, то не удаляются один или даже больше этих элементов из корзины. Наверное, тут дело в переменной $i, но даже ее удаление unset($i) или уменьшение декрементом $i-- проблему не решает. Помогите, пожалуйста, если можете. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 17:56)
| | > <td><input name='id' type='radio' value="<?=$i;?>" /></td>
$i откуда берется?
Должен браться из ключа сессионного массива. | |
|
|
|
|
|
|
|
для: Trianon
(27.11.2010 в 18:05)
| | id определяется так:
<?php $i = 0;
foreach($_SESSION["cart"] as $val) {
$sql = mysql_query("SELECT id_production, title, price, id_catalog FROM production WHERE id_production = $val", $dbcnx);
$foo = mysql_fetch_array($sql); ?>
<tr><td><input name='id' type='radio' value="<?=$i;?>" />
</td><td><a href="detail.php?id_catalog=<?=$foo['id_catalog'];?>&id_production=<?=$foo['id_production'];?>"><?=$foo["title"];?></a></td><td><?=$foo["price"];?></td><td></td></tr>
<?php
$i++;
}
?>
Этот id не соответствует ключам из базы потому что сама корзина не хранится в таблицах, а сделана на сессиях. Просто при выводе корзины id является индексом элемента в массиве. Это сделано для того, чтобы при удалении данных из $_SESSION["cart"] использовать функцию unset, а она удаляет по индексу, а не по значение, то есть когда я удаляю:
unset ($_SESSION["cart"][$id]);
то $id обязательно должен быть индексом массива и быть соответственно 0 или 1 или 2 и т.д. а не содержать мои id_production из базы. Тут вопрос в том, чтобы удалить из массива сессии $_SESSION["cart"]. Только все время появляются ошибки. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 18:16)
| | >Этот id не соответствует ключам из базы потому что сама корзина не хранится в таблицах, а сделана на сессиях.
А должно быть как раз наоборот, тем более, что корзина в сессии, это ее временное место нахождения. | |
|
|
|
|
|
|
|
для: sim5
(27.11.2010 в 19:13)
| | Для корзины это не временное место нахождения, потому что в базе должны потом храниться заказы, а корзина будет после оформления заказа очищаться. Если делать корзину на таблицах в базе он мускул очень нагружается прежде всего из-за тяжелого запроса UPDATE. А вот уже заказанным товарам как раз нужно храниться там.
Я просто хотел спросить, можете ли вы помочь с переменной $i, но пока видимо нет. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 20:25)
| | Знаете, говорить о тяжести запросов UPDATE и в то же время гонять в цикле SELECT, это примерно как крестик без трусов. | |
|
|
|
|
|
|
|
для: Trianon
(27.11.2010 в 20:30)
| | Но выборка и чтение через SELECT намного проще для мускула, потому что именно обновление через UPDATE наиболее нагружают БД. Поэтому апдейт лучше избегать при работе с пользовательской частью сайта. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 22:02)
| | Вы вообще представляете, сколько строк будет занимать таблица позиций заказов?
Сколько посетителей одновременно будут работать с корзиной?
Сколько товаров в среднем в корзину класть?
Блин, ну ведь чушь же пишете и не стесняетесь нисколько...
Если Вы такой поборник экономии ресурсов, то для работы непосредственно с корзиной сервер вообще можно не затрагивать. Всё сделать на клиентской стороне, а на сервер отправлять уже готовый набор выбранного товара.
Только, повторюсь, я не понимаю, как Вы при этом допустили SELECT в цикле?
А где у Вас живет истинная $i, я вам уже намекнул.
А Sim5 намекнул откытым текстом сказал, что ради приличия ею стоит сделать код товара из базы данных.
Одно другому не противоречит. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 20:25)
| | Все правильно, данные корзины будут переписаны в заказ, но руководствоваться надо при этом не абстрактными нуликами и единичками, о чем вы тут пишите, а id продуктов. Напишите разумно свою корзину и ничего лишнего делать не придется. | |
|
|
|
|
|
|
|
для: sim5
(27.11.2010 в 20:38)
| | Там просто более сложные массивы, я думал через $i будет проще реализовать. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 18:16)
| | Подумайте над этой строкой:
foreach($_SESSION["cart"] as $val)
|
| |
|
|
|
|
|
|
|
для: Trianon
(27.11.2010 в 19:19)
| | Пришлось переделывать массив. Большое спасибо за помощь. Теперь работает. Сама корзина теперь такой массив:
if (isset($_POST["new"])) {
$new=$_POST["new"];
if(!$_SESSION["cart"][$new])
{
$cart[$new]=1;
$_SESSION["cart"][$new] = $cart;
}
Выборка такая:
foreach($_SESSION["cart"] as $key=>$val) {
$sql = mysql_query("SELECT id_production, title, price, id_catalog FROM production WHERE id_production = $key", $dbcnx);
$foo = mysql_fetch_array($sql);
А кнопка такая:
<input name='id' type='radio' value="<?=$key;?>" />
Спасибо. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 23:25)
| | Не вникал в беседу, тут мэтры советуют. Но вот в этом случае
<?
foreach($_SESSION["cart"] as $key=>$val) {
$sql = mysql_query("SELECT id_production, title, price, id_catalog FROM production WHERE id_production = $key", $dbcnx);
| посоветовал бы обратить внимание на оператор IN
Замечательная, скажу Вам, штука. | |
|
|
|
|
|
|
|
для: Николай2357
(27.11.2010 в 23:29)
| | Штука конечно замечательная, только он же сразу выдаст несколько записей до прохождения цикла. Чего то мне не сообразить как это будет выглядеть, потому что так как без IN заполняется каждая строка в таблице, а с IN даже не знаю как. Сейчас уже не могу понять. | |
|
|
|
|
|
|
|
для: Lelius
(27.11.2010 в 23:37)
| | $keys = array_keys($_SESSION["cart"]);
... where id in (".implode(' , ', $keys).");"; | |
|
|
|
|
|
|
|
для: Красная_шляпа
(28.11.2010 в 02:07)
| | У меня еще тут один вопрос появился такой. Я вывожу количество товара таким образом:
foreach($_SESSION["cart"] as $key=>$val) {
$sql = mysql_query("SELECT id_production, title, price, id_catalog FROM production WHERE id_production = $key", $dbcnx);
$foo = mysql_fetch_array($sql); ?>
<input name='number' type='text' size="2" value="<?=$val[$key];?>" />
Но вот если я хочу поменять 1 экземпляр товара на другое число, например, 2 или 3. То как мне его сохранить и как вывести. Если также <?=$val[$key];?> то число не изменится и останется 1.
А после нажатия на кнопку "Пересчитать" выполняется следующий сценарий:
if ($_POST["updbutton"]) {
$id = $_POST["id"];
unset ($_SESSION["cart"][$id]);
}
Это сделано для удаления и непонятно где в $_SESSION или еще можно сохранить количество экземпляров. Первоначально единица 1 появляется при появлении товара в сессии, так:
if (isset($_POST["new"])) {
$new=$_POST["new"];
if(!$_SESSION["cart"][$new])
{
$cart[$new]=1;
$_SESSION["cart"][$new] = $cart;
}
А вот что делать, чтобы поменять на другое число, не знаю. Если знаете, помогите пожалуйста. | |
|
|
|
|
|
|
|
для: Lelius
(28.11.2010 в 02:37)
| | Корзина товаров, это целая философия, что будет делать корзина, и как ее написать, зависит как раз от этой философии. Корзина в минимальном плане содержит уникальный id товара, как ключ в массиве товаров выбранных покупателем, под которым как минимум есть значение количества товара, а может быть цена и прочие его характеристики. В этом случае легко получать из такого массива как одиночный товар, так и группу товаров, удалять, добавлять, сортировать и т.п.
У вас же нет корзины, кроме этого, вам уже сказали об операторе IN, тем не менее вы продолжаете третировать MySQL запросами в цикле. И что вам говорить после этого, вернее зачем? | |
|
|
|
|
|
|
|
для: sim5
(28.11.2010 в 03:22)
| | поправлю немного $_SESSION["cart"][$уникальный_идентификатор_товара] = $количество_в_корзине | |
|
|
|