Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сессии и корзина

62K
09 февраля 2011 года
sebastjan
16 / / 20.01.2011
Прошу помощи, сделал две формы добавления артиклей в корзину,
использую сесси,всё добавляеться но то что добавленно раньше исчезает.
Не могу понять как сделать чтоб записи из сессии сохранялись и добавлялись.
Код:
<?
session_start();
echo "<form action='aaa.php' method='post'>
kolicestvo<input name='a' type='text' size='3'value='1' maxlength='20'/>cena-5.5 eu
<input name='ok1' type='submit' value='ok1'/><br/><br/>
<input name='td_name'  value='TABLIZA_1' type='hidden'/>
<input name='art_name' value='ARTIKEL_1' type='hidden'/>
<input name='cena' value='5.5' type='hidden'/>
udalit iz korzini<input name='del' type='submit' value='Delet'/>
</form><br>"
;

echo "<form action='aaa.php' method='post'>
kolicestvo<input name='a' type='text' size='3'value='1' maxlength='20'/>cena-7 eu
<input name='ok2' type='submit' value='ok2'/><br/><br/>
<input name='td_name'  value='TABLIZA_2' type='hidden'/>
<input name='art_name' value='ARTIKEL_2' type='hidden'/>
<input name='cena' value='7' type='hidden'/>
udalit iz korzini<input name='del' type='submit' value='Delet'/>
</form>"
;
if( $_POST['ok1'])
     {
      $_SESSION['td_name']=$_POST['td_name'];
      $_SESSION['art_name']=$_POST['art_name'];
      $_SESSION['cena']+=$_POST['cena'];
      $_SESSION['kol']+=$_POST['a'];  
      $_SESSION['rezult']=$_SESSION['cena']*=$_POST['a'];
       $ss="Iz tablici ".$_SESSION['td_name']." polucen artikel <br>";
       $ss.= $_SESSION['art_name']." - Naimenovaniem <br>";
       $ss.= $_SESSION['kol']."-x-".$_POST['cena']." EU = ".$_SESSION['rezult'];
       echo $ss;
    }
if( $_POST['ok2'])
     {
      $_SESSION['td_nam']=$_POST['td_name'];
      $_SESSION['art_nam']=$_POST['art_name'];
      $_SESSION['cen']+=$_POST['cena'];
      $_SESSION['ko']+=$_POST['a'];  
      $_SESSION['rezul']=$_SESSION['cen']*=$_POST['a'];
       $dd="Iz tablici ".$_SESSION['td_nam']." polucen artikel <br>";
       $dd.= $_SESSION['art_nam']." - Naimenovaniem <br>";
       $dd.=$_SESSION['ko']."-x-".$_POST['cena']." EU = ".$_SESSION['rezul'];
       echo $dd;
    }

 if ($_POST['del']){
session_unset($_SESSION[$_POST['del']]);
echo "Artikel udalion iz korzini";
}
?>
369
13 февраля 2011 года
Kesano
451 / / 09.10.2007
Всё дело в том что вы
1. Не умеете работать с сессиями
2. Не умеете работать с массивами

Я укажу вам на ошибку:
$_SESSION[i]['td_name']
Вы используете везде один и тот же ключ массива.
При чем, это и не "i" и не $i, а неизвестно что.
Пожалуйста, уделите внимание документации по PHP, а в частности - по работе с массивами.
А так же тому, что такое инкремент и декремент.
Когда прочитаете, вы поймете почему ваш код не работает.
62K
20 февраля 2011 года
sebastjan
16 / / 20.01.2011
Спасибо за направление в нужное русло, многое понял.
Есть нюансы, но всё же.
С улыбкой сейчас смотрю на то что накнопал.
369
20 февраля 2011 года
Kesano
451 / / 09.10.2007
Цитата: sebastjan
Спасибо за направление в нужное русло, многое понял.
Есть нюансы, но всё же.
С улыбкой сейчас смотрю на то что накнопал.


Всё правильно, разбирайтесь...

Могу предоставить свой кусок кода работы с корзиной...

Код:
if($_POST["updatecart"]) {
        $_SESSION["order"]["total"]=0;
        foreach($_POST["item"] as $key=>$val) {
            preg_match('#([0-9]+)#',$val,$match);
            $val=round($match[1]);
            if($val=='0') { unset($_SESSION["cart"][$key]); }
            else if($val>0){
                $_SESSION["cart"][$key]["val"]=$val;
                if($_SESSION["cart"][$key]["val"]>=$_SESSION["cart"][$key]["optval"]) {
                    $_SESSION["cart"][$key]["priceout"]=$_SESSION["cart"][$key]["priceopt"];
                }
                else {
                    $_SESSION["cart"][$key]["priceout"]=$_SESSION["cart"][$key]["price"];
                }
                $_SESSION["cart"][$key]["cost"]=($_SESSION["cart"][$key]["val"]*$_SESSION["cart"][$key]["priceout"]);
            }
            $_SESSION["order"]["total"]+=$_SESSION["cart"][$key]["cost"];
           
        }
    }
    if($_POST["addtocart"]) {
        $addid=mysql_real_escape_string($_POST["id"]);
        preg_match('#([0-9]+)#',$_POST["val"],$match);
        $val=round($match[1]);
       
        if($val>0) {
            $addres=mysql_query("select * from product where id='$addid'");
            if($addarr=mysql_fetch_array($addres)) {
               
                $_SESSION["cart"][$addid]["name"]=$addarr["name"];
                $_SESSION["cart"][$addid]["id"]=$addarr["id"];
                $_SESSION["cart"][$addid]["val"]+=$val;
                $_SESSION["cart"][$addid]["optval"]=$addarr["optval"];
                $_SESSION["cart"][$addid]["price"]=$addarr["price"];
                $_SESSION["cart"][$addid]["priceopt"]=$addarr["priceopt"];
                $_SESSION["cart"][$addid]["priceact"]=$addarr["priceact"];
                $_SESSION["cart"][$addid]["image"]=$addarr["image"];
               
                if($_SESSION["cart"][$addid]["val"]>=$_SESSION["cart"][$addid]["optval"]) {
                    $_SESSION["cart"][$addid]["priceout"]=$_SESSION["cart"][$addid]["priceopt"];
                }
                else {
                    $_SESSION["cart"][$addid]["priceout"]=$_SESSION["cart"][$addid]["price"];
                }
               
                $_SESSION["cart"][$addid]["cost"]=($_SESSION["cart"][$addid]["val"]*$_SESSION["cart"][$addid]["priceout"]);
               
            }
            $_SESSION["order"]["total"]+=$_SESSION["cart"][$addid]["cost"];
        }
    }
62K
23 февраля 2011 года
sebastjan
16 / / 20.01.2011
Вот немного подучился и накнопал свой вариант.
Задача была 1-добавить, 2-пересчинать, 3-держать результат в сесси,
4-возможность изменять.
Подключение к Базе только при подтверждении заказа и запись в базу к поьзователю тлько результат.
Так же нужно было чтоб не просто выводился масссив сесси с помощью foreach()
а переопредиление в переменные, чтоб можно было гибко их использовать.
Кнопка удаль не активизированна,так что не стоит на это обращатть внимание.
А так вроде работает хорошо, из формы (купить) передаёт имя товара, вносит в массив, считает,отнимает,результат.
Немного поясню, ID это имя товара из формы купить.
В общем как то так после двух недель учёбы и разборов полётов.
Код:
<?
session_start();
header("Content-Type: text/html; charset=utf-8");
$kauf= "<form action='new_session.php' method='post'>
<input name='id' value='NAME_AAA'   type='hidden'/> :Name Artikel-NAME_AAA
kolicestvo + <input name='stuk' type='text' size='3' value='1' maxlength='5'/>
<input name='preis' value='2'  type='hidden'/> :Preis 2 eu 1xSt.
<input name='ok'type='submit' value='ok'/><br/><br/>
</form>
<form action='new_session.php' method='post'>
<input name='id' value='NAME_BBB'   type='hidden'/> :Name Artikel-NAME_BBB
kolicestvo + <input name='stuk' type='text' size='3' value='1' maxlength='5'/>
<input name='preis' value='6'  type='hidden'/> :Preis 6 eu 1xSt.
<input name='ok' value='ok' type='submit' /><br/><br/>
</form>"
;
echo $kauf;
if(isset($_POST['ok'])){
$id=$_POST['id'];
$preis=" <b> Preis 1 x Stuk </b>";
$stuk=" <b> Wie viel Stuk = </b>";
$summa=" <b> Summa = </b> ";
/////////////////////////////////////
if($_SESSION[$id])
 {#if1
  $_SESSION[$id][$stuk]+=$_POST['stuk'];
   $_SESSION[$id][$preis]=$_POST['preis'];
   $_SESSION[$id][$summa]=$_SESSION[$id][$stuk]*$_POST['preis'];
   $_SESSION[$all_summa]+=$_POST['stuk']*$_POST['preis'];
   }else{
   $_SESSION[$id][$stuk]=$_POST['stuk'];
   $_SESSION[$id][$preis]=$_POST['preis'];
   $_SESSION[$id][$summa]=$_POST['stuk']*$_POST['preis'];
   $_SESSION[$all_summa]+=$_SESSION[$id][$summa];
         }
//////////////////////////////////
$form_del="<form action='new_session.php' method='post'>
   <input name=\"inputname\" value='{$key}'   type='hidden'/>
   <input  name='{$key}' value='{$key}'   type='hidden'/>
   <input name='delet' value='L&#246;schen' type='submit'/></form>"
;

//////////////////////////////////
foreach($_SESSION as $key=>$k)
 {#fore1
 $key." Zagolovok-1<br>";
 if($key==$all_summa)$all=$k;                
  else{#else2
      foreach($k as $ss=>$sss)
        {#fore2
        if($ss==$stuk) {$pr=$sss; echo $stuk.$pr;}//pereopredilenie peremennih
         if($ss==$preis){$pr=$sss; echo $preis.$pr." EU ";}
         if($ss==$summa){$pr=$sss; echo $summa.$pr.$form_del;}
        }#fore2
     }#else2
 }#fore1
 foreach($_SESSION as $bb=>$bbb)
   {if($bb==$all_summa){$all=$bbb;}}
   echo "<hr>".$all;

 }#if1
?>
15
23 февраля 2011 года
shaelf
2.7K / / 04.05.2005
2Kesano Купи и прочти книгу "Совершенный код". Ты пишешь уже гораздо больше года и до сих пор проверяешь на int регуляркой. Это не правильно.
369
23 февраля 2011 года
Kesano
451 / / 09.10.2007
Цитата: shaelf
2Kesano Купи и прочти книгу "Совершенный код". Ты пишешь уже гораздо больше года и до сих пор проверяешь на int регуляркой. Это не правильно.



Без обид, но от вас, совершенного, я вообще никакого предложения не увидел ни в этом, ни в другом, интересном мне, топике.
Зачем искать щепку в чужом глазу, когда в своем бревно?

2 Себастьян
Не могу проверить ваш код, но если он работает - я рад за вас.
Выглядит достаточно лаконично... Мой код грузен, т.к. наполнен проверками на существование товара в корзине, работает с количеством и изменяемыми ценами, удаляет товар, если его коль-во в заказе 0...
В вашем коде нет проверок на соответствие...
Можно передать в переменную, например, stuk любой текст и, если вы также не проверяете данные при отправке MySQL-запроса, использовать инъекции...

15
23 февраля 2011 года
shaelf
2.7K / / 04.05.2005
Код:
<?php

$cart = $_SESSION["cart"];
$total = $_SESSION["order"]['total'];

if($_POST["updatecart"]) {
        $total = 0;
        foreach($_POST["item"] as $key=>$val) {
            $val = (int) $val;

            if($val == 0) { unset($_SESSION["cart"][$key]); }

            else if($val>0){
                $cart[$key]["val"]=$val;

                if($cart[$key]["val"]>=$cart[$key]["optval"]) {
                    $cart[$key]["priceout"]=$cart[$key]["priceopt"];
                } else {
                    $cart[$key]["priceout"]=$cart[$key]["price"];
                }

                $cart[$key]["cost"]=($cart[$key]["val"]*$cart[$key]["priceout"]);
            }

            $total += $cart[$key]["cost"];
        }
    }

    if($_POST["addtocart"] && isset($_POST['id'])) {
        $addid= (int) $_POST["id"];
        $val= (int) $_POST['val'];

        if($val>0 && !isset($cart[$addid])) {
            $addres=mysql_query("select * from product where id='$addid'");

            if($addarr=mysql_fetch_array($addres)) {
                $cart[$addid] = $addarr;
                $cart[$addid] += $val;

                if($cart[$addid]["val"] <$cart[$addid]["optval"]) {
                    $cart[$addid]["priceout"]=$cart[$addid]["price"];
                }

                $cart[$addid]["cost"]=($cart[$addid]["val"]*$cart[$addid]["priceout"]);
            }

            $total+=$cart[$addid]["cost"];

        } else if($cart[$addid]['val'] > 0) {
            $cart[$addid]['val'] += $val;
        }

    }

    $_SESSION["cart"] = $cart;
    $_SESSION["order"]['total'] = $total;


Тут я не пытался разобраться что тут работает, а что нет. Просто немного подрихтавал. Особо понравились место
 
Код:
$_SESSION["cart"][$key]["priceout"]=$_SESSION["cart"][$key]["priceopt"];


Как вариант ещё прикольно смотрелось
 
Код:
preg_match('#([0-9]+)#',$_POST["val"],$match);
$val=round($match[1]);

вместо
 
Код:
$val = (int) $_POST['val'];


PS Повторюсь, почитай книгу!
369
23 февраля 2011 года
Kesano
451 / / 09.10.2007
Цитата: shaelf


Тут я не пытался разобраться что тут работает, а что нет. Просто немного подрихтавал. Особо понравились место
 
Код:
$_SESSION["cart"][$key]["priceout"]=$_SESSION["cart"][$key]["priceopt"];


PS Повторюсь, почитай книгу!



1. Регулярка для того, чтобы выделить из переданного значения целое число... например, человек напечатал "у37" (т.е. случайно зацепил букву "У" под тройкой... Тем не менее, в такой примитивном случае число передастся верно. это ЗАДУМКА.
2.

 
Код:
$_SESSION["cart"][$key]["priceout"]=$_SESSION["cart"][$key]["priceopt"];

Как ни странно, но в этом магазине, который я писал, товар имеет несколько цен... розничную, мелкооптовую, крупнооптовую и акционную...
В зависимости от количества товара, в итоговую стоимость вывода (прайсаут) передается то или иное значение из того списка цен, что есть.
Для того, чтобы непосредственно в выводе не игратся с тем, какой ценник выводить на страницу, price, priceopt,priceact и т.д... всегда выводим priceout и не напрягаемся в процессе верстки...

Так что, Шалфей, лучше ты сначала почитай книжку... например об этикете... или о компьютерном этикете... :)

З.Ы. Книжечку Макконела скачал... 900 страниц... *****! в туалете особо не почитаешь? Можешь вышлешь мне почтой бумажный вариант? Буду благодарен...
244
23 февраля 2011 года
UAS
2.0K / / 19.07.2006
Вы бы, товарищ Кесано, повежливей отвечали человеку, который по опыту даст фору множеству веб-прогреров и мне в том числе.
Он вам сделал в целом корректные замечания, а в том, что у вас preg_match для какой-то конкретной задумки - слова сказано не было.
Так что по коду замечания в целом верные, и уж он явно отвечал вам в нормально тоне, хотя вы тут резко перекинулись на подколки и троллинг. Ай-яй, некрасиво и со стороны смотрится крайне глупо и по-школотовски.
369
23 февраля 2011 года
Kesano
451 / / 09.10.2007
Цитата: UAS
Вы бы, товарищ Кесано, повежливей отвечали человеку, который по опыту даст фору множеству веб-прогреров и мне в том числе.
Он вам сделал в целом корректные замечания, а в том, что у вас preg_match для какой-то конкретной задумки - слова сказано не было.


Да мне как-то не с руки расшаркиваться с быком... Пусть и опытным...
Замечания его некорректны, потому что "чукча не читатель, чукча - пейсатель"... Не разобравшись в сути кода, хотя там всё видно в строке
if($_SESSION["cart"][$key]["val"]>=$_SESSION["cart"][$key]["optval"]), высказал свои "замечания"...

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

62K
23 февраля 2011 года
sebastjan
16 / / 20.01.2011
Kesano я забыл сказать что в итоговом коде в сессии храняться только имя товара и количество, из формы нельзя будет передать
параметр в поле число(stuk) товара, это поле будет в конечном варианте проверяться - только числовое значение.
И при подтверждении заказа в базу будет произведенна запись с использованием mysql_real_escape_string()
хотя я думаю что если есть проверка поля на переменную числовую это уже лишнее проверять на mysql_real_escape_string(),
всё равно значение может быть только числом.
369
23 февраля 2011 года
Kesano
451 / / 09.10.2007
В принципе, проверки на int будет достаточно для безопасной записи в базу.
З.Ы, я бы советовал тебе товары кидать не "корень" сессии, а создать массив $cart... И пулить данные в него:
$_SESSION["cart"][$i][$cost]

Просто мало ли что еще придется хранить в сессии (логин, пароль, е-мейл), а так, после покупки или очистки корзины можно будет мгновенно её очистить любым удобным способом:
unset($_SESSION["cart"]);
$_SESSION["cart"]=array();
И т.д...
тогда тебе не придется
1. Удалять всю сессию
2. Перебирать массив с целью поиска записей о товаре, чтобы их удалить...
62K
24 февраля 2011 года
sebastjan
16 / / 20.01.2011
Так оно и получилось, спасибо за помощь.
В корне у меня храниться майл пользователя по котрому его отслеживаю.
Как раз утром сегодня с этим и столкнулся.
Ещё раз спасибо
860
26 февраля 2011 года
Abell2000
138 / / 15.01.2003
Цитата: Kesano
1. Регулярка для того, чтобы выделить из переданного значения целое число... например, человек напечатал "у37" (т.е. случайно зацепил букву "У" под тройкой... Тем не менее, в такой примитивном случае число передастся верно. это ЗАДУМКА.



а если я напишу фх4лд92лд3 что из этого должно быть ценой и где я случайно зацепил фхлдлд? если человек не может напечатать нормально цифры, то надо ему об этом намекнуть, а не подставлять цыфры за него, потому что подставленные данны могут оказаться совсем не теми, что он хотел впечатать :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог