Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2011, 22:16   #1
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
Печаль Проблема с сессиями

Здравствуйте!
Пишу скрипт интернет-магазина.
Допустим, что $_SESSION состоит из
Array ( [basket] => Array ( [tovarnum] => 1 [199847] => Array ( [coll] => 1 ) [tovars] => 199847 ) ) .
На страничке корзины, при нажатии на кнопку Пересчитать выполняется следующий скрипт:
PHP код:
 if(($_GET['step'] == 'mybasket')&&(!empty($_POST)))
 {
 
session_start();
 
$ni explode(',',$_SESSION[basket][tovars]);
 
$g $_SESSION[basket][tovarnum];
  
 while(
$g != 0){
     if((int)
$_POST[$ni[$g-1]] > '0'){
     
$pperror[count($pperror)+1] = 'Ошибка при изменении количества товара #'.$ni[$g-1];
     }elseif((int)
$_POST[$ni[$g-1]] == '0'){
     
$_SESSION[basket][tovarnum]--;
     unset(
$_SESSION[basket][$ni[$g-1]]);
     
     
$ntemp explode(',',$_SESSION[basket][tovars]);
     unset(
$ntemp[$g-1]);
     
$_SESSION[basket][tovars] = implode(',',$ntemp);
     
     }else{
     
$_SESSION[basket][$ni[$g-1]] = $_POST[$ni[$g-1]];
     }
     
$g--;
 }
 } 
Почему после выполения данного скрипта массив $_SESSION преобретает данную конструкцию:
Array ( [basket] => Array ( [tovarnum] => 0 [tovars] => ) )

Весь смысл выполнения данного скрипта заключается в пересчёте товаров на страничке.
(На начальной странице корзины предоставлено меню со всеми товарами в корзине и по текстовому полю для каждого товара. После этого все данные отправляются (post) на страничку обработки с вышенаписанным скриптом.)
Раньше этот скрипт работал, но сейчас он неконтролируем. В чём проблема не могу понять.
impulsgraw вне форума Ответить с цитированием
Старый 16.06.2011, 03:57   #2
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

$_SESSION[basket][tovars]
что это такое? какой это язык? Это уж точно не PHP. Где кавычки?

Что за китайский код? Где вы учились так программировать?


PHP код:
if(($_GET['step'] == 'mybasket')&&(!empty($_POST)))
{
    
session_start();
    
$_SESSION = array('basket'=>array('199847'=>array('amount'=>1))); // для примера
    
foreach ($_SESSION['basket'] as $k=>$item) {
        if(!isset(
$_POST[$k]) || (int)$_POST[$k] == 0) {
            unset(
$_SESSION['basket'][$k]);
        } elseif((int)
$_POST[$k] > '0') {
            
$pperror[count($pperror)+1] = 'Ошибка при изменении количества товара #'.$k;
        } else {
            
$_SESSION['basket'][$k]['amount'] = (int)$_POST[$k];
        }
    }

Никаких explode/implode, никаких $ni[$g-1]. Если нужно узнать общее количество наименований в корзине, то можно сделать count($_SESSION['basket'])
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 16.06.2011, 12:00   #3
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

Вообщето так тоже будет правильно писать:
$_SESSION[basket][tovars]
$_SESSION['basket']['tovars']
это одно и тоже, хоть и не очень правильно, но php это варит и это экономит время.

$_SESSION['basket']['tovars'] содержит коды товаров через запятую (например 19923,13324) от того и explode и implode, тоесть, если указано товара #19923 0 штук, то тогда он удаляется из корзины. Если меньше нуля, то пишется ошибка.

$_SESSION['basket']['tovarnum'] содержит количество (например 2) товаров в корзине.

$_SESSION['basket']['13324']['coll'] содержит штучное количество товара.
Да, и вот исправленый код.

Код:

if(($_GET['step']=='mybasket') && (!empty($_POST['basket_post']))){

$mExpl = explode(",",$_SESSION['basket']['tovars'].",");

$tShet = $_SESSION['basket']['tovarnum'];

while($tShet != 0){
	
	$jmexpl = $mExpl[$tShet-1];

	if((int)$_POST[$jmexpl] < 0)
	{
	$error .= "<br>Неверно введено количество товара (#".$jmexpl.")";
	$tShet--;
	}
	elseif((int)$_POST[$jmexpl] == 0)
	{
	print (int)$_POST[$jmexpl];
	unset($_SESSION['basket'][$jmexpl]);
	$_SESSION['basket']['tovarnum']--;

	$tTempExpl = explode(',',$_SESSION['basket']['tovars']);
	unset($tTempExpl[$tShet-1]);
	$_SESSION['basket']['tovars'] = implode(',',$tTempExpl);

	$tShet--;
	}
	else
	{
	$_SESSION['basket'][$jmexpl]['coll'] = $_POST[$jmexpl];
	$tShet--;
	}
}
}
impulsgraw вне форума Ответить с цитированием
Старый 16.06.2011, 12:17   #4
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

В любом случае спасибо, проблему решил путём отделения корзины и каталога на отдельные страницы.
impulsgraw вне форума Ответить с цитированием
Старый 17.06.2011, 04:01   #5
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

PHP много чего переваривает. Вы пишете быдлокод. С вашими соплями потом настоящим программистам приходится глаза и мозг ломать. То, что вы даже не удосужились попробовать разобраться в том, как работает приведённый мной пример кода, говорит о многом.

Что если я пошлю запрос формы и передам вашему скрипту через POST basket_post=1 и всё. Больше ничего постом не передавать. Что будет с вашим быдлоскриптом? Он сдуется. Где проверки? Вы пишете в сессию напрямую переменную из POST, без проверки типа. Что, если вместо количества передать abcde? Как вы потом это количество будете считать? Небось и в базу без проверки записывается.

После таких вот "всё-и-так-работает-хорошо" клиенты от PHP открещиваются и ищут программистов на ASP, Perl, Python и т.д., потому что считают, что PHP глючный и кривой.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 01.06.2013, 17:57   #6
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

На ваше удивление, я скажу вам, что проверка есть. Она запихана в процедуре, которая запускается автоматически при открытии страницы. Но я всё это ненужное вырезал из моего БЫДЛОКОДА дабы сэкономить вам время, чтобы сразу было понятно, где ошибка.

Цитата:
Сообщение от Johnatan Посмотреть сообщение
PHP много чего переваривает.
Ну наверно не зря? Действительно, в данном случае, я не прав. Но рас php варит код такого вида, почему бы не воспользоваться? Данный код приватный и больше ни один программист не будет его просматривать.
P.S. Не обязательно так ЯРОСТНО РУГАТЬСЯ.
impulsgraw вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с сессиями bboyb-rock PHP 1 29.01.2011 09:39
Загвостка с сессиями. nec117 PHP 2 05.04.2010 01:13
Проблема с сессиями в PHP Demien PHP 25 16.03.2010 23:37
Управление сессиями NSvirus PHP 3 15.10.2009 22:07
проблема с сессиями nntpaha PHP 3 16.03.2008 16:10