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]   

> Без описания
arimanecro
Отправлено: 07 Апреля, 2015 - 10:06:53
Post Id



Частый гость


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


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




Приветствую.

Стандартная обработка формы и занесение ошибок в массив:

reg.php

PHP:
скопировать код в буфер обмена
  1. if(isset($_POST['submit'])) {
  2.         $name = clear_str($_POST['for_name']);
  3.         $email = clear_str($_POST['for_email']);
  4.         $_SESSION['items']['name'] = $name;
  5.         $_SESSION['items']['email'] = $email;
  6.  
  7. бла-бла...
  8.  
  9. if(empty($name)) {
  10.                 $error[] = 'Login: cannot be blank';
  11.         }
  12.         elseif(mb_strlen($name) < 5) {
  13.                 $error[] = 'Login: Lenght must be between 5 and 10';
  14.         }
  15.         elseif(mb_strlen($name) > 12) {
  16.                 $error[] = 'Login: Lenght must be between 5 and 10';
  17.         }
  18.  
  19. бла-бла...
  20.  
  21. if(isset($error) && !empty($error)) {
  22.                         $_SESSION['error'] = $error;
  23.  
  24. бла-бла...
  25.  
  26. header('Location:'.$_SERVER['REQUEST_URI']);
  27. }


reg.tpl

CODE (html):
скопировать код в буфер обмена
  1. <input name="for_name" type="text" placeholder="name" value="<?php echo $_SESSION['items']['name'];?>" required>
  2. <input name="for_email" type="text" placeholder="email" value="<?php echo $_SESSION['items']['email'];?>" required>
  3.  
  4. <?php
  5. unset($_SESSION['items']);
  6. ?>



==========

Непонятка заключается в том, что внутри value ничего не отображается. Почему сессия убивается раньше времени, ведь по коду, сначала идет вывод, а потом уже unset ??? Непонял!
 
 Top
Faraon-san
Отправлено: 07 Апреля, 2015 - 10:24:36
Post Id



Посетитель


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


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




вместо unset сделай var_dump
 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 10:29:10
Post Id


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


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


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




ты ее везде стартуешь где обращаешься к $_SESSION ?
ты ее вообще стартуешь?
 
 Top
arimanecro
Отправлено: 07 Апреля, 2015 - 10:35:04
Post Id



Частый гость


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


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




конечно сессия стартуется.
Стоит убрать unset($_SESSION['items']); и все данные в value показываются
 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 10:41:09
Post Id


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


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


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




Чудеса
Ты явно чтото приводишь в сокращенной форме или с иными правками и допущениями(в которых ты и ошибаешься скорее всего)
unset точно в одном файле с формой?
точно именно эта форма отображается?
ну и тд
Дебажь
Втыкай через строчку по вардампуУлыбка
 
 Top
arimanecro
Отправлено: 07 Апреля, 2015 - 10:58:13
Post Id



Частый гость


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


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




на данной странице, етсь ещё:

if(isset($_SESSION['thanks'])) {
echo $_SESSION['thanks'];
unset($_SESSION['thanks']);
}

но я же конкретно убиваю сессию thanks, а не $_SESSION['items']
=====

вардамп выдает всё пучком:

array (size=4)
'name' => string 'tttttt' (length=6)
'email' => string 'tttt@euro.md' (length=12)
'address' => string 'tttttt' (length=6)
'phone' => string '0' (length=1)

если бы была проблема с передачей данных в сессию, то данные, что с unset($_SESSION['items']);, что без нее, не отображались бы
====

могу выложить весь код, если нужно Радиация

(Отредактировано автором: 07 Апреля, 2015 - 11:00:26)

 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 11:33:35
Post Id


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


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


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




есть вариант что ты неверно допустил что unset идет после формы
может всетаки это разные файлы и удаление происходит на самом деле до?
дебажь пошагово от точки входа
хорошо бы конечно использовать нормальный IDE и отладчик
но вполне можно ивардампы помучать
проблема не типичная и никто тебе не даст ответа
надо щупать лично ручками
короче терпение и дебаг
 
 Top
arimanecro
Отправлено: 07 Апреля, 2015 - 11:56:24
Post Id



Частый гость


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


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




я мучаюсь уже второй день, перепробовал наверное всё, и тупо не вижу логики, почему сначала удаляется сессия, а потом выводится.
Поэтому вылаживаю код(он небольшой), с надеждой, что кто-нибудь, увидит да вразумит Ниндзя

index.php

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. session_start(); // КАК ВИДИМ СЕССИЯ СТАРТУЕТ :)
  3. include "./inc/conn.php";
  4. include "./inc/config.php";
  5. include "./inc/func.php";
  6. include "./inc/vars.php";
  7. include './inc/header.php';
  8. ?>
  9. <div id="content" class="clearfix">
  10.           <?PHP
  11.                   if(!isset($_GET['page'])) {
  12.                          $_GET['page'] = 'default';
  13.                   }
  14.                   include './tpl/'.$_GET['page'].'.php';
  15.                   include './tpl/'.$_GET['page'].'.tpl';
  16.                   ?>
  17.         <?PHP include './inc/footer.php';?>
  18.         </div>


Далее, подключается php файл(reg.php), его содержание:

PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($_SESSION['thanks'])) {
  3.         echo $_SESSION['thanks'];
  4.         unset($_SESSION['thanks']);
  5. }
  6.  
  7. if(isset($_SESSION['error'])){
  8.                 echo "<div class='errors'>
  9.                         <center>
  10. <h1>Your information contains <u>$count_err</u> errors</h1>
  11. </center>
  12.                         <ul style='margin-top: -5px;'>";
  13.                         foreach ($_SESSION['error'] as $errors) {
  14.                                 echo "<li>$errors</li>";               
  15.                 }
  16.                 echo '</ul></div>';
  17.                 unset($_SESSION['error']);
  18.         }
  19.        
  20. if(isset($_POST['submit'])) {
  21.         $name = clear_str($_POST['for_name']);
  22.         $email = clear_str($_POST['for_email']);
  23.         $pass = clear_str($_POST['for_pass']);
  24.         $address = clear_str($_POST['for_address']);
  25.         $phone = clear_str((int)$_POST['for_phone']);
  26.         $captcha = clear_str($_POST['for_captcha']);
  27.        
  28.         $_SESSION['items']['name'] = $name;
  29.         $_SESSION['items']['email'] = $email;
  30.         $_SESSION['items']['address'] = $address;
  31.         $_SESSION['items']['phone'] = $phone;
  32.        
  33.         if(empty($name)) {
  34.                 $error[] = 'Login: cannot be blank';
  35.         }
  36.         elseif(mb_strlen($name) < 5) {
  37.                 $error[] = 'Login: Lenght must be between 5 and 10';
  38.         }
  39.         elseif(mb_strlen($name) > 12) {
  40.                 $error[] = 'Login: Lenght must be between 5 and 10';
  41.         }
  42.         elseif(verific_stmt($query3 = "SELECT name FROM z_users WHERE name = ?", $name)) {
  43.                 $error[] = "Sorry, user: <u>$name</U> already exists";
  44.                 } // name
  45.                
  46.                 // ТУТ ИДЕТ КУЧА ПРОВЕРОК МЫЛА, ТЕЛЕФОНА ИТД, ПОЭТОМУ ВЫРЕЗАЮ       ДАННЫЕ КУСКИ
  47.                                
  48. }
  49.  
  50.                 if(isset($error) && !empty($error)) {
  51.                         $_SESSION['error'] = $error;
  52.                        
  53.  
  54.                 }      
  55.         else {
  56.                
  57. // ТУТ РЕСАЙЗИТЬСЯ АВАТАРКА И ЗАНОСИТСЯ В БД
  58.                
  59.                
  60.                 $_SESSION['thanks'] = '
  61.                 <div id="thanks">      
  62. <h1>Thank you for Your Registration. <br>You must login to your account</h1>.
  63. ';
  64.                 header('Location: index.php?page=reg');
  65.         }
  66.         header('Location:'.$_SERVER['REQUEST_URI']);   
  67.         }
  68.        
  69.  


А вот TPL файл

CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="post" enctype="multipart/form-data" id="form_wrapp">
  3. <input name="for_name" type="text" placeholder="name" value="<?php echo $_SESSION['items']['name'];?>" required>
  4. <input name="for_email" type="text" placeholder="email" value="<?php echo $_SESSION['items']['email'];?>" required>
  5.  
  6. // ДРУГИЕ ПОЛЯ ФОРМЫ...
  7. </form>
  8. <?php
  9. unset($_SESSION['items']);
  10. ?>
  11.  
 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 12:01:23
Post Id


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


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


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




я могу ошибаться но я кажется догадался
у тебя идет отображение формы и потом удаление сессии и при этом идет редирект
какой-нибудь из header('Location: отрабатывает
таким образом сессия удаляется
форма не отображается
идет редирект и там уже форма отображается без сессии
---
arimanecro пишет:
я мучаюсь уже второй день
извини чувак
спасение утопающих дело рук самих утопающих
учись дебажить
(Добавление)
после каждого редиректа добавляй die;
(Добавление)
чтобы не забывать выдели это в ф-цию
PHP:
скопировать код в буфер обмена
  1. function redirect($location){
  2.     header('Location:'.$location);
  3.     die;
  4. }

(Добавление)
еще важное пояснение
ты наверное думаешь что после header('Location:'.$location); скрипт умирает
это не так
до конца выполняется
 
 Top
arimanecro
Отправлено: 07 Апреля, 2015 - 12:11:30
Post Id



Частый гость


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


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




LIME пишет:
после каждого редиректа добавляй die;


помогло, плюсую в карму Здорово

LIME пишет:
извини чувак
спасение утопающих дело рук самих утопающих


согласен, но когда ошибка в глазах опытного пользователя выглядит плевым делом, а для новичка это непроходимый барьер, то почему бы не помочь? ;)
например с die, я бы никогда не догадался без твоей помощи, а решение-то, как видим, плевое, так сказать в одном словечке Улыбка
 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 12:17:15
Post Id


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


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


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




как бонус тебе совет
если видишь повторяющиеся дейстивя тут же заворачивай их в ф-цию/метод
таким образом ты локализуешь место для будущих изменений
например тебе ты в будущем захочешь при редиректе что-то в лог записать
тогда просто добавляешь код в ф-цию и не бегаешь по всему коду
даже если ф-ция состоит всего из одного действия но ты предугадываешь что в будущем возможно изменение этого действия тогда тоже в ф-цию его
 
 Top
arimanecro
Отправлено: 07 Апреля, 2015 - 12:23:33
Post Id



Частый гость


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


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




LIME

а у меня как раз и была функция редиректа:

function red($url) {
header("Location: ".$url);
}

и я ее первоначально использовал, но ничего не работало, поэтому я уже дошел до того, что писал редирект вручную, типа а вдруг... Улыбка

сейчас добавил в данную ф-ию die и всё пучком Круто
 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 12:32:33
Post Id


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


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


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




тогда включаю режим зануды))
плохое название для ф-ции, ну не то чтобы совсем плохое, но лучше не экономить на времени написания кода
нужно экономить на времени чтения кода
назови ее полностью redirect
программист гораздо чаще читает код чем пишет
даже свой
все имена лучше пусть будут длиннее но предельно понятно что делают из названия
даже есть такой признак
если ты называешь ф-цию полностью описывая ее действие и название слишком длинное значит ты плохо ее написал
значит ее надо разделить на несколько меньших
например
setValueToUserAndSaveItToDb()
значит тут лучше выделить код в 2 ф-ции
 
 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