Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Присвоение сессионному параметру значения оказывает влияние на то, что расположено выше него.
Покинул форум
Сообщений всего: 3
Дата рег-ции: Дек. 2012
Помог: 0 раз(а)
Здравствуйте.
В целях изучения php пишу что-то вроде Интернет-магазина (этот «портал» всего лишь учебный проект и не будет никуда внедрён). Возникла проблема при добавлении отзыва к товару, а точнее при обработке ошибок (выводе сообщений о них), которые могут возникнуть при добавлении отзыва (это пустой текст отзыва и неверно введённая капча). Поскольку ошибки обрабатываются аналогично друг другу, я решил остановиться на пустом отзыве. Если пользователь пытается добавить пустой отзыв, то ему просто должно показаться сообщение, о том, что отзыв не может быть пустым.
Кстати, структура сайта такая. Он разбит на несколько php-страниц, но только одна (index.php) является самостоятельной, все остальные подключаются с помощью include при выборе соответствующего раздела.
Я решил осуществить то, что задумал следующим образом. Когда у меня нажата кнопка «отправить отзыв», у меня проверяется textarea на пустоту и, если оно пусто, то в сессионный параметр запомнить код ошибки, после чего с помощью функции header перейти на ту же страницу, откуда мы пытались добавить пустой отзыв. В коде это выглядит так. Когда у меня нажата кнопка «отправить отзыв», исполняется такой код (находится на странице index.php)
С помощью header('location:' . $_SERVER['HTTP_REFERER'] . '#ReviewErrorMsg'); мы подключаем содержимое страницы GoodPage.php (переводится как страница товара), куда передаём несколько GET-параметров. Критическая область той страницы имеет такое словесное описание: если $_SESSION['ReviewErrorCode'] равно 1 (чего и должно происходить, ведь до перехода на ту страницу я придал ей значение 1), то с помощью echo вывести строку "Отзыв не может быть пустым!", после чего в надежде на то, что пользователь исправится, сбросить переменную $_SESSION['ReviewErrorCode'] в нуль. В коде это выглядит так (часть страницы GoodPage.php)
// считаем, что 1 - пустой отзыв, 2 - неверная капча, 0 и всё остальное - ошибок нет
if($_SESSION['ReviewErrorCode']==1)
{
//die('=======================');
echo'Отзыв не может быть пустым!';
$_SESSION['ReviewErrorCode']=0;// (*)
}
elseif($_SESSION['ReviewErrorCode']== 2)
{
echo'Введённые символы неверны. Попробуйте ещё раз';
$_SESSION['ReviewErrorCode']=0;
}
else
{
};
?>
Вот здесь-то и возникает проблема. Дело в том, что этот if не выполняется (насколкьо я понимаю). В этом виню строку
$_SESSION['ReviewErrorCode'] = 0;
Если раскоментировать строку //die('======================='); перед эхо, то становится видно, что if выполняется. Но, если не убирать этот комментарий у строки этой, а перед условным оператором вывести значение переменной $_SESSION['ReviewErrorCode'] с помощью die, то можно увидеть, что она равна нулю, хотя ей собственноручно было присвоего значение 1. То есть, получается, что строка $_SESSION['ReviewErrorCode'] = 0; влияет на то, что написано ДО НЕЁ. как такое может быть, вообще не понимаю. Прошу помощи. (может, я чего-то просто не вижу?).
Функцию session_start() я использую, она находится в первых строках страницы index.php
Stivir
Отправлено: 18 Декабря, 2012 - 17:08:16
Частый гость
Покинул форум
Сообщений всего: 128
Дата рег-ции: Май 2012
Помог: 2 раз(а)
Цитата:
Я решил осуществить то, что задумал следующим образом. Когда у меня нажата кнопка «отправить отзыв», у меня проверяется textarea на пустоту и, если оно пусто, то в сессионный параметр запомнить код ошибки, после чего с помощью функции header перейти на ту же страницу
Оригинально.
А нельзя просто взять и проверить, типа такого:
Покинул форум
Сообщений всего: 3
Дата рег-ции: Дек. 2012
Помог: 0 раз(а)
Не совсем понимаю, тогда где такой код вставить? В обработчике нажатия кнопки? Тогда надпись "Вы ничего не написали" будет выводиться вверху страницы, в самом верху. Мне же нужно, чтобы она выводилась в самой форме, например над полем для отзыва.
В принципе такая задача может быть решена через использование GET-параметров, более того, аналогичная задача у меня так и решена, я могу решить и эту задачу таким же образом, но мне интересно знать, почему у меня так происходит.
Stivir
Отправлено: 19 Декабря, 2012 - 09:33:11
Частый гость
Покинул форум
Сообщений всего: 128
Дата рег-ции: Май 2012
Помог: 2 раз(а)
Для решения таких задач используется не только код php, но и вёрстка. Вставляете div туда куда Вам нужно, подключаете стили и внутри этого дива вызываете метод класса или функцию, смотря как у Вас реализовано. То что делаете Вы это почти тоже самое, что лечить горло через задний проход.
LIME
Отправлено: 19 Декабря, 2012 - 09:39:45
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Покинул форум
Сообщений всего: 3
Дата рег-ции: Дек. 2012
Помог: 0 раз(а)
Да, спасибо, была подкинута очень хорошая идея насчёт дивов, что и было мной реализовано. Я поступил следующим образом.
Проверил текст на пустоту (извините, но функцией empty не пользовался, просто проверил ПОСТ-параметр на пустоту). Если пустота имела, то я генерировал сообщение об ошибке, которое помещал в DIV, для которого с помощью CSS настроил фиксированное позиционирование. В итоге, если пользователь попытался отправить пустоту или ввёл неверно капчу, то на страницу выводится фиксированный див с текстом ошибки. В принципе неплохо, но пользователю приходится прокручивать окно страницы, дабы добраться до формы и ввести текст. В принципе, вроде как эргономично, но с точки зрения, если не ошибаюсь, юзабилити (извините, если неправильно выразился) этот как-то не очень.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.