Сессии и корзина
использую сесси,всё добавляеться но то что добавленно раньше исчезает.
Не могу понять как сделать чтоб записи из сессии сохранялись и добавлялись.
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";
}
?>
1. Не умеете работать с сессиями
2. Не умеете работать с массивами
Я укажу вам на ошибку:
$_SESSION[i]['td_name']
Вы используете везде один и тот же ключ массива.
При чем, это и не "i" и не $i, а неизвестно что.
Пожалуйста, уделите внимание документации по PHP, а в частности - по работе с массивами.
А так же тому, что такое инкремент и декремент.
Когда прочитаете, вы поймете почему ваш код не работает.
Есть нюансы, но всё же.
С улыбкой сейчас смотрю на то что накнопал.
Есть нюансы, но всё же.
С улыбкой сейчас смотрю на то что накнопал.
Всё правильно, разбирайтесь...
Могу предоставить свой кусок кода работы с корзиной...
$_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"];
}
}
Задача была 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ö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
?>
Без обид, но от вас, совершенного, я вообще никакого предложения не увидел ни в этом, ни в другом, интересном мне, топике.
Зачем искать щепку в чужом глазу, когда в своем бревно?
2 Себастьян
Не могу проверить ваш код, но если он работает - я рад за вас.
Выглядит достаточно лаконично... Мой код грузен, т.к. наполнен проверками на существование товара в корзине, работает с количеством и изменяемыми ценами, удаляет товар, если его коль-во в заказе 0...
В вашем коде нет проверок на соответствие...
Можно передать в переменную, например, stuk любой текст и, если вы также не проверяете данные при отправке MySQL-запроса, использовать инъекции...
$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;
Тут я не пытался разобраться что тут работает, а что нет. Просто немного подрихтавал. Особо понравились место
Как вариант ещё прикольно смотрелось
$val=round($match[1]);
вместо
PS Повторюсь, почитай книгу!
Тут я не пытался разобраться что тут работает, а что нет. Просто немного подрихтавал. Особо понравились место
PS Повторюсь, почитай книгу!
1. Регулярка для того, чтобы выделить из переданного значения целое число... например, человек напечатал "у37" (т.е. случайно зацепил букву "У" под тройкой... Тем не менее, в такой примитивном случае число передастся верно. это ЗАДУМКА.
2.
Как ни странно, но в этом магазине, который я писал, товар имеет несколько цен... розничную, мелкооптовую, крупнооптовую и акционную...
В зависимости от количества товара, в итоговую стоимость вывода (прайсаут) передается то или иное значение из того списка цен, что есть.
Для того, чтобы непосредственно в выводе не игратся с тем, какой ценник выводить на страницу, price, priceopt,priceact и т.д... всегда выводим priceout и не напрягаемся в процессе верстки...
Так что, Шалфей, лучше ты сначала почитай книжку... например об этикете... или о компьютерном этикете... :)
З.Ы. Книжечку Макконела скачал... 900 страниц... *****! в туалете особо не почитаешь? Можешь вышлешь мне почтой бумажный вариант? Буду благодарен...
Он вам сделал в целом корректные замечания, а в том, что у вас preg_match для какой-то конкретной задумки - слова сказано не было.
Так что по коду замечания в целом верные, и уж он явно отвечал вам в нормально тоне, хотя вы тут резко перекинулись на подколки и троллинг. Ай-яй, некрасиво и со стороны смотрится крайне глупо и по-школотовски.
Он вам сделал в целом корректные замечания, а в том, что у вас preg_match для какой-то конкретной задумки - слова сказано не было.
Да мне как-то не с руки расшаркиваться с быком... Пусть и опытным...
Замечания его некорректны, потому что "чукча не читатель, чукча - пейсатель"... Не разобравшись в сути кода, хотя там всё видно в строке
if($_SESSION["cart"][$key]["val"]>=$_SESSION["cart"][$key]["optval"]), высказал свои "замечания"...
ТСу нужно понять принцип работы... И примера ему достаточно... Оптимизировать и вылизывать код - это уже его задача, как бы...
параметр в поле число(stuk) товара, это поле будет в конечном варианте проверяться - только числовое значение.
И при подтверждении заказа в базу будет произведенна запись с использованием mysql_real_escape_string()
хотя я думаю что если есть проверка поля на переменную числовую это уже лишнее проверять на mysql_real_escape_string(),
всё равно значение может быть только числом.
З.Ы, я бы советовал тебе товары кидать не "корень" сессии, а создать массив $cart... И пулить данные в него:
$_SESSION["cart"][$i][$cost]
Просто мало ли что еще придется хранить в сессии (логин, пароль, е-мейл), а так, после покупки или очистки корзины можно будет мгновенно её очистить любым удобным способом:
unset($_SESSION["cart"]);
$_SESSION["cart"]=array();
И т.д...
тогда тебе не придется
1. Удалять всю сессию
2. Перебирать массив с целью поиска записей о товаре, чтобы их удалить...
В корне у меня храниться майл пользователя по котрому его отслеживаю.
Как раз утром сегодня с этим и столкнулся.
Ещё раз спасибо
а если я напишу фх4лд92лд3 что из этого должно быть ценой и где я случайно зацепил фхлдлд? если человек не может напечатать нормально цифры, то надо ему об этом намекнуть, а не подставлять цыфры за него, потому что подставленные данны могут оказаться совсем не теми, что он хотел впечатать :)