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 :: Присвоение сессионному параметру значения оказывает влияние на то, что расположено выше него.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Не понимаю, как такое возможно.
Вадим Мошев
Отправлено: 18 Декабря, 2012 - 15:52:26
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Здравствуйте.
В целях изучения php пишу что-то вроде Интернет-магазина (этот «портал» всего лишь учебный проект и не будет никуда внедрён). Возникла проблема при добавлении отзыва к товару, а точнее при обработке ошибок (выводе сообщений о них), которые могут возникнуть при добавлении отзыва (это пустой текст отзыва и неверно введённая капча). Поскольку ошибки обрабатываются аналогично друг другу, я решил остановиться на пустом отзыве. Если пользователь пытается добавить пустой отзыв, то ему просто должно показаться сообщение, о том, что отзыв не может быть пустым.

Кстати, структура сайта такая. Он разбит на несколько php-страниц, но только одна (index.php) является самостоятельной, все остальные подключаются с помощью include при выборе соответствующего раздела.

Я решил осуществить то, что задумал следующим образом. Когда у меня нажата кнопка «отправить отзыв», у меня проверяется textarea на пустоту и, если оно пусто, то в сессионный параметр запомнить код ошибки, после чего с помощью функции header перейти на ту же страницу, откуда мы пытались добавить пустой отзыв. В коде это выглядит так. Когда у меня нажата кнопка «отправить отзыв», исполняется такой код (находится на странице index.php)

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. // Обработка добавления отзыва для товара
  4.         if (isset($_POST['HiddenReviews']))
  5.                 {
  6.                         $Author = strip_tags($_POST['Author'], '');
  7.                         //$Author = trim();
  8.                         if ($Author == '')
  9.                                 $Author = 'Анонимный автор';
  10.                        
  11.                         $Text = strip_tags($_POST['Text'], '');
  12.                        
  13.                         if ($Text == '')
  14.                                 {
  15.                                         //$AddReviewErrorMessage = 'Текст отзыва не может быть пустым!';
  16.                                         $_SESSION['ReviewErrorCode'] = 1; // (1)
  17.                                        
  18.                            // die($_SESSION['ReviewErrorCode']);          
  19.                                         header('location:' . $_SERVER['HTTP_REFERER'] . '#ReviewErrorMsg');
  20.                                 }
  21.                                
  22.                                 else
  23.                                         {// добавляем отзыв в БД, но только если правильно ввели капчу и текст не пустой
  24.                                        
  25.                                                 if ($_SESSION['kod'] == $_POST['Captcha'])
  26.                                                         {
  27.                                                                 $QueryString = "insert into GoodsReviews
  28.                                                                                                 (
  29.                                                                                                         Id_Good,
  30.                                                                                                         Author,
  31.                                                                                                         Text
  32.                                                                                                 )
  33.                                                                                                
  34.                                                                                         values
  35.                                                                                                 (
  36.                                                                                                         ".$_SESSION['ReviewedGoodId'].",
  37.                                                                                                         '".$Author."',
  38.                                                                                                         '".$Text."'
  39.                                                                                                 )";
  40.                                                                                                
  41.                                                                                                
  42.                                                                                                
  43.                                                                 mysql_query($QueryString);
  44.                                                                 if (mysql_insert_id() > 0)
  45.                                                                         {
  46.                                                                                 $_SESSION['ReviewErrorCode'] = 0;
  47.                                                                                 header('location:' . $_SERVER['HTTP_REFERER'] . '#Review' . mysql_insert_id());
  48.                                                                         }
  49.                                                                                
  50.                                                         }
  51.                                                        
  52.                                                         else
  53.                                                                 {
  54.                                                                         $_SESSION['ReviewErrorCode'] = 2;
  55.                                                                         header('location:' . $_SERVER['HTTP_REFERER'] . '&WrongCaptcha#ReviewErrorMsg');       
  56.                                                                 };
  57.                                                                                                                
  58.                                         };             
  59.                 };
  60. ?>
  61.  



С помощью header('location:' . $_SERVER['HTTP_REFERER'] . '#ReviewErrorMsg'); мы подключаем содержимое страницы GoodPage.php (переводится как страница товара), куда передаём несколько GET-параметров. Критическая область той страницы имеет такое словесное описание: если $_SESSION['ReviewErrorCode'] равно 1 (чего и должно происходить, ведь до перехода на ту страницу я придал ей значение 1), то с помощью echo вывести строку "Отзыв не может быть пустым!", после чего в надежде на то, что пользователь исправится, сбросить переменную $_SESSION['ReviewErrorCode'] в нуль. В коде это выглядит так (часть страницы GoodPage.php)

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. // обработка ошибок
  4.                                         // считаем, что 1 - пустой отзыв, 2 - неверная капча, 0 и всё остальное - ошибок нет
  5.                                        
  6.                                        
  7.                                        
  8.                                        
  9.                                         if ($_SESSION['ReviewErrorCode'] == 1 )
  10.                                                 {
  11.                                                        
  12.                                                         //die('=======================');
  13.                                                        
  14.                                                         echo 'Отзыв не может быть пустым!';
  15.                                                         $_SESSION['ReviewErrorCode'] = 0; // (*)
  16.                                                 }
  17.                                                
  18.                                                 elseif ($_SESSION['ReviewErrorCode'] == 2)
  19.                                                         {
  20.                                                                 echo 'Введённые символы неверны. Попробуйте ещё раз';
  21.                                                                 $_SESSION['ReviewErrorCode'] = 0;
  22.                                                         }
  23.                                                        
  24.                                                 else
  25.                                                         {
  26.                                                                
  27.                                                         };
  28.  
  29. ?>
  30.  


Вот здесь-то и возникает проблема. Дело в том, что этот if не выполняется (насколкьо я понимаю). В этом виню строку
$_SESSION['ReviewErrorCode'] = 0;

Если раскоментировать строку //die('======================='); перед эхо, то становится видно, что if выполняется. Но, если не убирать этот комментарий у строки этой, а перед условным оператором вывести значение переменной $_SESSION['ReviewErrorCode'] с помощью die, то можно увидеть, что она равна нулю, хотя ей собственноручно было присвоего значение 1. То есть, получается, что строка $_SESSION['ReviewErrorCode'] = 0; влияет на то, что написано ДО НЕЁ. как такое может быть, вообще не понимаю. Прошу помощи. (может, я чего-то просто не вижу?).

Функцию session_start() я использую, она находится в первых строках страницы index.php
 
 Top
Stivir
Отправлено: 18 Декабря, 2012 - 17:08:16
Post Id


Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Май 2012  


Помог: 2 раз(а)




Цитата:
Я решил осуществить то, что задумал следующим образом. Когда у меня нажата кнопка «отправить отзыв», у меня проверяется textarea на пустоту и, если оно пусто, то в сессионный параметр запомнить код ошибки, после чего с помощью функции header перейти на ту же страницу

Оригинально.
А нельзя просто взять и проверить, типа такого:
PHP:
скопировать код в буфер обмена
  1.  
  2. if(empty($_POST['txt']))
  3.     echo 'Вы ничего не написали.';
  4.  
 
 Top
Вадим Мошев
Отправлено: 18 Декабря, 2012 - 21:42:32
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Не совсем понимаю, тогда где такой код вставить? В обработчике нажатия кнопки? Тогда надпись "Вы ничего не написали" будет выводиться вверху страницы, в самом верху. Мне же нужно, чтобы она выводилась в самой форме, например над полем для отзыва.

В принципе такая задача может быть решена через использование GET-параметров, более того, аналогичная задача у меня так и решена, я могу решить и эту задачу таким же образом, но мне интересно знать, почему у меня так происходит.
 
 Top
Stivir
Отправлено: 19 Декабря, 2012 - 09:33:11
Post Id


Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Май 2012  


Помог: 2 раз(а)




Для решения таких задач используется не только код php, но и вёрстка. Вставляете div туда куда Вам нужно, подключаете стили и внутри этого дива вызываете метод класса или функцию, смотря как у Вас реализовано. То что делаете Вы это почти тоже самое, что лечить горло через задний проход.
 
 Top
LIME
Отправлено: 19 Декабря, 2012 - 09:39:45
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




PHP:
скопировать код в буфер обмена
  1. if(empty(trim($_POST['txt'])))
  2.     echo 'Вы ничего не написали.';
 
 Top
Мелкий Супермодератор
Отправлено: 19 Декабря, 2012 - 09:57:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME пишет:
if(empty(trim($_POST['txt'])))

Вы уже обновились до PHP5.5? И как оно?
В стабильных ветках empty ещё не умеет проверять результат выполнения функций.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 19 Декабря, 2012 - 09:59:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




дада))
PHP:
скопировать код в буфер обмена
  1. $_POST['txt']=trim($_POST['txt']);
  2. if(empty($_POST['txt']))
  3.     echo 'Вы ничего не написали.';
 
 Top
Stivir
Отправлено: 19 Декабря, 2012 - 10:09:45
Post Id


Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Май 2012  


Помог: 2 раз(а)




LIME, тогда наверное лучшеУлыбка
PHP:
скопировать код в буфер обмена
  1.  
  2. $txt=trim($_POST['txt']);
  3. if(empty($txt))
  4.     echo 'Вы ничего не написали.';
  5.  
 
 Top
Вадим Мошев
Отправлено: 19 Декабря, 2012 - 17:45:22
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Да, спасибо, была подкинута очень хорошая идея насчёт дивов, что и было мной реализовано. Я поступил следующим образом.
Проверил текст на пустоту (извините, но функцией empty не пользовался, просто проверил ПОСТ-параметр на пустоту). Если пустота имела, то я генерировал сообщение об ошибке, которое помещал в DIV, для которого с помощью CSS настроил фиксированное позиционирование. В итоге, если пользователь попытался отправить пустоту или ввёл неверно капчу, то на страницу выводится фиксированный див с текстом ошибки. В принципе неплохо, но пользователю приходится прокручивать окно страницы, дабы добраться до формы и ввести текст. В принципе, вроде как эргономично, но с точки зрения, если не ошибаюсь, юзабилити (извините, если неправильно выразился) этот как-то не очень.

Вот фрагмент кода:

PHP:
скопировать код в буфер обмена
  1.  
  2. if ($Text == '')
  3.                                 {
  4.                                 ?>
  5.                                         <div id="ReviewErrorMessage">
  6.                         Вы оставили отзыв пустым!
  7.                     </div>     
  8.                                        
  9.                                 <?PHP
  10.                                        
  11.                                 }
  12.  


Разумеется, если бы использовался JavaScript, насчёт этого не пришлось бы вообще заморачиваться, но я его не знаю пока.

Тем не менее, если ли способ сделать как-то более менее удобно?
 
 Top
Stivir
Отправлено: 19 Декабря, 2012 - 17:58:01
Post Id


Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Май 2012  


Помог: 2 раз(а)




Это Вы сделали только 1-у проверку, а их должно быть ..на все случаи жизни.) Есть одно хорошее правило: пользовательским данным доверять нельзя!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB