Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с корзиной на сессиях
 
 автор: Lelius   (27.11.2010 в 17:56)   письмо автору
 
 

Здравствуйте,
Я стал писать магазин на сессиях и почти написал. В корзину добавляется товар таким образом: $_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-- проблему не решает. Помогите, пожалуйста, если можете.

  Ответить  
 
 автор: Trianon   (27.11.2010 в 18:05)   письмо автору
 
   для: Lelius   (27.11.2010 в 17:56)
 

> <td><input name='id' type='radio' value="<?=$i;?>" /></td>
$i откуда берется?
Должен браться из ключа сессионного массива.

  Ответить  
 
 автор: Lelius   (27.11.2010 в 18:16)   письмо автору
 
   для: 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"]. Только все время появляются ошибки.

  Ответить  
 
 автор: sim5   (27.11.2010 в 19:13)   письмо автору
 
   для: Lelius   (27.11.2010 в 18:16)
 

>Этот id не соответствует ключам из базы потому что сама корзина не хранится в таблицах, а сделана на сессиях.

А должно быть как раз наоборот, тем более, что корзина в сессии, это ее временное место нахождения.

  Ответить  
 
 автор: Lelius   (27.11.2010 в 20:25)   письмо автору
 
   для: sim5   (27.11.2010 в 19:13)
 

Для корзины это не временное место нахождения, потому что в базе должны потом храниться заказы, а корзина будет после оформления заказа очищаться. Если делать корзину на таблицах в базе он мускул очень нагружается прежде всего из-за тяжелого запроса UPDATE. А вот уже заказанным товарам как раз нужно храниться там.
Я просто хотел спросить, можете ли вы помочь с переменной $i, но пока видимо нет.

  Ответить  
 
 автор: Trianon   (27.11.2010 в 20:30)   письмо автору
 
   для: Lelius   (27.11.2010 в 20:25)
 

Знаете, говорить о тяжести запросов UPDATE и в то же время гонять в цикле SELECT, это примерно как крестик без трусов.

  Ответить  
 
 автор: Lelius   (27.11.2010 в 22:02)   письмо автору
 
   для: Trianon   (27.11.2010 в 20:30)
 

Но выборка и чтение через SELECT намного проще для мускула, потому что именно обновление через UPDATE наиболее нагружают БД. Поэтому апдейт лучше избегать при работе с пользовательской частью сайта.

  Ответить  
 
 автор: Trianon   (27.11.2010 в 22:20)   письмо автору
 
   для: Lelius   (27.11.2010 в 22:02)
 

Вы вообще представляете, сколько строк будет занимать таблица позиций заказов?
Сколько посетителей одновременно будут работать с корзиной?
Сколько товаров в среднем в корзину класть?

Блин, ну ведь чушь же пишете и не стесняетесь нисколько...

Если Вы такой поборник экономии ресурсов, то для работы непосредственно с корзиной сервер вообще можно не затрагивать. Всё сделать на клиентской стороне, а на сервер отправлять уже готовый набор выбранного товара.

Только, повторюсь, я не понимаю, как Вы при этом допустили SELECT в цикле?

А где у Вас живет истинная $i, я вам уже намекнул.
А Sim5 намекнул откытым текстом сказал, что ради приличия ею стоит сделать код товара из базы данных.
Одно другому не противоречит.

  Ответить  
 
 автор: sim5   (27.11.2010 в 20:38)   письмо автору
 
   для: Lelius   (27.11.2010 в 20:25)
 

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

  Ответить  
 
 автор: Lelius   (27.11.2010 в 21:59)   письмо автору
 
   для: sim5   (27.11.2010 в 20:38)
 

Там просто более сложные массивы, я думал через $i будет проще реализовать.

  Ответить  
 
 автор: Trianon   (27.11.2010 в 19:19)   письмо автору
 
   для: Lelius   (27.11.2010 в 18:16)
 

Подумайте над этой строкой:
foreach($_SESSION["cart"] as $val) 

  Ответить  
 
 автор: Lelius   (27.11.2010 в 23:25)   письмо автору
 
   для: 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;?>" />
Спасибо.

  Ответить  
 
 автор: Николай2357   (27.11.2010 в 23:29)   письмо автору
 
   для: 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
Замечательная, скажу Вам, штука.

  Ответить  
 
 автор: Lelius   (27.11.2010 в 23:37)   письмо автору
 
   для: Николай2357   (27.11.2010 в 23:29)
 

Штука конечно замечательная, только он же сразу выдаст несколько записей до прохождения цикла. Чего то мне не сообразить как это будет выглядеть, потому что так как без IN заполняется каждая строка в таблице, а с IN даже не знаю как. Сейчас уже не могу понять.

  Ответить  
 
 автор: Красная_шляпа   (28.11.2010 в 02:07)   письмо автору
 
   для: Lelius   (27.11.2010 в 23:37)
 

$keys = array_keys($_SESSION["cart"]);
... where id in (".implode(' , ', $keys).");";

  Ответить  
 
 автор: Lelius   (28.11.2010 в 02:37)   письмо автору
 
   для: Красная_шляпа   (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;

}
А вот что делать, чтобы поменять на другое число, не знаю. Если знаете, помогите пожалуйста.

  Ответить  
 
 автор: sim5   (28.11.2010 в 03:22)   письмо автору
 
   для: Lelius   (28.11.2010 в 02:37)
 

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

У вас же нет корзины, кроме этого, вам уже сказали об операторе IN, тем не менее вы продолжаете третировать MySQL запросами в цикле. И что вам говорить после этого, вернее зачем?

  Ответить  
 
 автор: Красная_шляпа   (28.11.2010 в 12:42)   письмо автору
 
   для: sim5   (28.11.2010 в 03:22)
 

поправлю немного $_SESSION["cart"][$уникальный_идентификатор_товара] = $количество_в_корзине

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования