Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30

Почему значение $_SESSION['email'] не сохраняется после перезагрузки страницы?

02.03.2018, 20:01. Показов 5274. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пользователь вводит данные в форму, они передаются в PHP обработчик. Здесь после проверки на полноту и уникальность открывается сессия, значение $_POST['email'] сохраняется $_SESSION['email'] . После этого введенные пользователем данные и случайно сгенерированный код сохраняется в базе данных MySQL. Код отправляется пользователю и его перебрасывает на страницу ввода этого кода . Далее предполагалось извлечь из базы данных сохраненный там код для пользователя с адресом $_SESSION['email'] и сравнить этот код с тем, что прислал пользователь. Но $_SESSION['email'] оказывается пустым.
В чем дело? И можно ли вообще таким образом организовать подтверждение регистрации? Задача состоит в том, чтобы организовать подтверждение регистрации с помощью кода (переход по ссылке здесь не подходит). Можно ли для решения этой задачи обойтись только PHP и MySQL? Решение задачи с last_insert_id не подходит, потому что с его помощью нельзя сделать восстановление забытого пароля.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2018, 20:01
Ответы с готовыми решениями:

Как сделать, чтобы при отметке чекбокса, его значение checked сохранялось после перезагрузки страницы?
Ребят, есть страница, на ней есть чекбоксы допустим 10. Сначало они не отмечены или отмечены. Как мне сделать что бы при отметке чекбокса,...

Значение $_SESSION['auth'] исчезает при перезагрузке страницы
Насколько я понимаю, установленные в $_SESSION значения должны сохраняться на время работы пользователя со страницей. Ниже простейший...

Не сохраняется $_SESSION
Здравствуйте, пытаюсь сохранить адрес почты в сессию $_SESSION = $answer_agent_check -> email;, при попытки вывести - пустота, если...

20
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 20:11
Цитата Сообщение от Ветер1 Посмотреть сообщение
Можно ли для решения этой задачи обойтись только PHP и MySQL?
Да.
Цитата Сообщение от Ветер1 Посмотреть сообщение
$_SESSION['email'] оказывается пустым
Где-то ошибка в коде. session_start(); нигде не забыт?
0
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 20:20  [ТС]
session_start(); пишу прямо перед $_SESSION['email'] = $_POST['email'];
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 20:22
А на странице куда потом пользователя перебрасывает? Там тоже должен стоять session_start();
0
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 20:30  [ТС]
При этом выдает предупреждение
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\OSPanel\domains\shablon.local3\includ es\access.inc.php:202) in C:\OSPanel\domains\shablon.local3\includ es\access.inc.php on line 54

В строке 54 уже есть session_start(); но он находится в форме входа и должен запускаться только если нажата кнопка "ВОЙТИ": if (isset($_POST['action']) and $_POST['action'] == 'Войти')

Если session_start(); в строке 54 закомментировать, ничего не меняется, $_SESSION['email'] после перезагрузки пустой

Добавлено через 3 минуты
Пользователя перебрасывает в форму login.html.php (<!DOCTYPE html>).

Если поставить в нее <?php session_start(); ?> выдает

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\OSPanel\domains\shablon.local3\admin\ login.html.php:10) in C:\OSPanel\domains\shablon.local3\admin\ login.html.php on line 10
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 20:35
Цитата Сообщение от Ветер1 Посмотреть сообщение
и его перебрасывает на страницу ввода этого кода
Пользователь код вводит на той же странице на которой регистрируется, или на другой? Стоит редирект?

Добавлено через 1 минуту
<?php session_start(); ?> нужно ставить в начало файла, первая строка

Добавлено через 3 минуты
В общем, файл login.html.php должен начинаться с
HTML5
1
2
3
<?php session_start(); ?>
.....
всё остальное
0
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 20:39  [ТС]
<?php session_start(); ?> в самом начале файла тоже ничего не меняет
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 20:41
А можно код страницы, на которой пользователь должен ввести код (там где идёт выборка из БД по $_SESSION['email']) ?
0
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 20:47  [ТС]
пользователь вводит код на другой странице, именно туда ставлю <?php session_start(); ?>
(и в форму ввода тоже)

Добавлено через 4 минуты
Страница, на которой пользователь должен ввести код:

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php session_start(); ?>
<!DOCTYPE html>
<html lang="ru">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      </head>
  <body>
      <form action="" method="POST">
      <input type="text" name="confirm" size=6>
      <input type="submit" value="Отправить">
      </form>
    </p>
    <br>
  <p><a href="/admin/">Вернуться на главную</a></p>
  </body>
</html>
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 20:51
По описанию алгоритма, всё должно работать
PHP
1
2
3
session_start();
$_SESSION['email']=$_POST['email'];
header("Location: proverca.php");
proverca.php:
PHP
1
2
session_start();
echo $_SESSION['email'];
Если у Вас такая схема работает, то ошибка в коде.
0
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 20:52  [ТС]
Страница, на которой происходит обработка полученного кода:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
<?php
// Вывод заголовка с данными о кодировке страницы
  header('Content-Type: text/html; charset=utf-8'); 
  // Настройка локали браузера
  setlocale(LC_ALL, 'ru_RU.65001', 'rus_RUS.65001', 'Russian_Russia. 65001',     'russian');
    // Настройка подключения к базе данных
  //$pdo->exec('SET NAMES "utf8"');
  
 //====================================================================
 //Вход
 function userIsLoggedIn()
{
  if (isset($_POST['action']) and $_POST['action'] == 'Войти')
  {
    if (!isset($_POST['email']) or $_POST['email'] == '' or
      !isset($_POST['password']) or $_POST['password'] == '')
    {
      $GLOBALS['loginError'] = 'Вы не ввели свой логин или пароль';
      return FALSE;
    }
 
    $password = md5($_POST['password']);
 
    if (databaseContainsAuthor($_POST['email'], $password))
    {
      session_start();
      $_SESSION['loggedIn'] = TRUE;
      $_SESSION['email'] = $_POST['email'];
      $_SESSION['password'] = $password;
      return TRUE;
    }
    else
    {
      session_start();
      unset($_SESSION['loggedIn']);
      unset($_SESSION['email']);
      unset($_SESSION['password']);
      $GLOBALS['loginError'] =
          'The specified email address or password was incorrect.';
      return FALSE;
      }
  } 
 
 if (isset($_POST['action']) and $_POST['action'] == 'logout')
  {
    session_start();
    unset($_SESSION['loggedIn']);
    unset($_SESSION['email']);
    unset($_SESSION['password']);
    header('Location: ' . $_POST['goto']);
    exit();
  }
 
  session_start();
  if (isset($_SESSION['loggedIn']))
  {
    return databaseContainsAuthor($_SESSION['email'], $_SESSION['password']);
  }
 
}
//-------------------------------------------------------------
 //Функция проверки на наличие в базе
function databaseContainsAuthor($email, $password)
{
  include 'db.inc.php';
 
  try
  {
    $sql = 'SELECT COUNT(*) FROM author
        WHERE email = :email AND password = :password';
    $s = $pdo->prepare($sql);
    $s->bindValue(':email', $email);
    $s->bindValue(':password', $password);
    $s->execute();
  }
  catch (PDOException $e)
  {
    $error = 'Error searching for author.';
    include 'error.html.php';
    exit();
  }
 
  $row = $s->fetch();
 
  if ($row[0] > 0)
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}
//-------------------------------------------------------------
//Функция проверки роли
function userHasRole($role)
{
  include 'db.inc.php';
 
  try
  {
    $sql = "SELECT COUNT(*) FROM author
        INNER JOIN authorrole ON author.id = authorid
        INNER JOIN role ON roleid = role.id
        WHERE email = :email AND role.id = :roleId";
    $s = $pdo->prepare($sql);
    $s->bindValue(':email', $_SESSION['email']);
    $s->bindValue(':roleId', $role);
    $s->execute();
  }
  catch (PDOException $e)
  {
    $error = 'Error searching for author roles.';
    include 'error.html.php';
    exit();
  }
 
  $row = $s->fetch();
 
  if ($row[0] > 0)
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}
//===================================================================
//РЕГИСТРАЦИЯ
//Проверка на заполненность
if (isset($_POST['action']) and $_POST['action'] == 'Зарегистрироваться')
{
    session_start();
    $_SESSION['email'] = $_POST['email'];
      if (!isset($_POST['email']) or $_POST['email'] == '' or
       !isset($_POST['password']) or $_POST['password'] == '' or
       !isset($_POST['name']) or $_POST['name'] == '')
           {
          $GLOBALS['loginError'] = 'Все поля обязательны для заполнения';
          return FALSE;
           }
       $password = md5($_POST['password']);
       $datareg=date("Y-m-d", time());
    
//Проверка на уникальность
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/access.inc.php';      
      if (databaseUnicAuthor($_POST['name'], $_POST['email'], $password))
            {
//Запись в БД 
             $rand = rand(100000, 999999);  //Генерация случайного числа
             try
                 {
                   include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php';
                   $sql = 'INSERT INTO author (name, email, password, datareg) values(:name, :email, :password, :datareg)';
                   $s = $pdo->prepare($sql);
                   $s->bindValue(':name', $_POST['name']);
                   $s->bindValue(':email', $_POST['email']);
                   $s->bindValue(':password', $password);
                   $s->bindValue(':datareg', $datareg);
                   $s->execute();
                 }
            catch (PDOException $e)
                 {
                    $error = 'Ошибка вставки в БД при регистрации.';
                    include 'error.html.php';
                    exit();
                 }
    $mess= "На указанный Вами адрес электронной почты <br>
            отправлено письмо с кодом для подтверждения регистрации.<br>
            Введите этот код здесь";
          
  echo "Отправленный пользователю токен"; 
    echo $rand . "<br>";
 echo "<br>" . "<br>"; 
  
  echo "SESSION['email'] до вызова message"; 
    echo $_SESSION['email'] . "<br>";
 echo "<br>" . "<br>"; 
  
  $to=$_POST['email'];
  $subject="Регистрация на сайте ";
  $message="Код для подтверждения регистрации" . $rand;    
   $headers="From: <mz914536@gmail.com>\r\nContent-type: text/plain; charset=utf-8\r\n";
    mail($to, $subject, $message,  $headers);
    include 'message.html.php';
 
 
 echo "POST['email'] до вызова message"; 
    echo $_POST['email'] . "<br>";
 echo "<br>" . "<br>"; 
  header('Location: .');
  exit();
    }   
}       
//Завершение регистрации
//введен и отправлен ПРАВИЛЬНЫЙ код 
//подтверждения регистрации
    if (isset($_POST['confirm']))
{
     
    echo "SESSION['email'] после отправки пользователем кода"; 
    echo $_SESSION['email'] . "<br>";
    echo "<br>" . "<br>";  
     
     
     
     
     try
                 {
                   include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php';
                   $sql = 'SELECT code FROM author WHERE email = :email';
                   $s = $pdo->prepare($sql);
                   $s->bindValue(':email', $_SESSION['email']);
                   $s->execute();
                 }
            catch (PDOException $e)
                 {
                    $error = 'Ошибка вставки в БД при регистрации.';
                    include 'error.html.php';
                    exit();
                 }
}
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 20:55
Лучший ответ Сообщение было отмечено Ветер1 как решение

Решение

А на той странице где происходит выборка из БД по $_SESSION['email']? Там есть session_start();?

Добавлено через 45 секунд
session_start(); должен стоять до header('Content-Type: text/html; charset=utf-8');

Добавлено через 1 минуту
session_start(); всегда должен быть в начале документа, до вывода заголовков.
1
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 21:04  [ТС]
То есть
PHP
1
2
3
session_start();
$_SESSION['email']=$_POST['email'];
header("Location: proverca.php");
нужно писать в той форме, в которой пользователь отправляет код?????

Добавлено через 3 минуты
Есть
Цитата Сообщение от sasha0012 Посмотреть сообщение
А на той странице где происходит выборка из БД по $_SESSION['email']? Там есть session_start();?
Есть, но не в начале
0
 Аватар для otto-fukin
14 / 60 / 21
Регистрация: 15.06.2017
Сообщений: 572
02.03.2018, 21:06
Цитата Сообщение от Ветер1 Посмотреть сообщение
header('Content-Type: text/html; charset=utf-8');
* // Настройка локали браузера
* setlocale(LC_ALL, 'ru_RU.65001', 'rus_RUS.65001', 'Russian_Russia. 65001', * * 'russian');
* * // Настройка подключения к базе данных
* //$pdo->exec('SET NAMES "utf8"');
//======================================== ============================
*//Вход
*function userIsLoggedIn()
{
* if (isset($_POST['action']) and $_POST['action'] == 'Войти')
* {
* * if (!isset($_POST['email']) or $_POST['email'] == '' or
* * * !isset($_POST['password']) or $_POST['password'] == '')
* * {
* * * $GLOBALS['loginError'] = 'Вы не ввели свой логин или пароль';
* * * return FALSE;
* * }
$password = md5($_POST['password']);
if (databaseContainsAuthor($_POST['email'], $password))
* * {
* * * session_start();
* * * $_SESSION['loggedIn'] = TRUE;
А чего вы хотите, сначала начинаете вывод в браузер, потом пытаетесь значения сессии устанавливать. Заголовки то ушли уже
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 21:07
Я вообще не пойму зачем там столько session_start(); понатыкано...
поставьте:
PHP
1
2
session_start();
header('Content-Type: text/html; charset=utf-8');
а все остальные уберите
0
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 30
02.03.2018, 21:08  [ТС]
Ура, заработало!
session_start(); в начале обработчика и все заработало наконец!
СПАСИБО!
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 21:16
Вы главное остальные session_start(); уберите, а то ошибки постоянно будут выскакивать...
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
02.03.2018, 21:46
Цитата Сообщение от sasha0012 Посмотреть сообщение
session_start(); должен стоять до header('Content-Type: text/html; charset=utf-8');
неправда
Цитата Сообщение от sasha0012 Посмотреть сообщение
session_start(); всегда должен быть в начале документа, до вывода заголовков.
неправда. session_start может быть в любом месте, важно чтоб вызван был до начала вывода тела ответа
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
02.03.2018, 21:50
))) от перемены мест слагаемых, их сума не меняется....
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
02.03.2018, 21:54
Цитата Сообщение от sasha0012 Посмотреть сообщение
))) от перемены мест слагаемых, их сума не меняется....
И как это относится к теме вопроса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2018, 21:54
Помогаю со студенческими работами здесь

PHP и Arduino. COM порт. Не сохраняется $_SESSION
Требуется управлять платой Arduino по usb - ком интерфейс. Ос ubuntu. Отправка в ком порт - как и в файл: fopen, fwrite. Сначала делал...

Скрывать блок после перезагрузки страницы
Здравствуйте, необходимо сделать так чтобы после клика и передачи get-параметров на ту же страницу, перестал отображаться блок в котором...

Не подгружается контент после перезагрузки страницы
&lt;!DOCTYPE html&gt; &lt;script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js'&gt;&lt;/script&gt; ...

После перезагрузки страницы текущая сессия удаляется
Здравствуйте. Помогите разобраться с сессиями. У меня вот такое дело. При авторизации если все ОК, создается сессия $_SESSION = true ....

Обновление данных формы после перезагрузки страницы
Ситуация: Через локальный сервер открыл страничку. Данных с формы никаких - скрипт не запущен еще. После обработки скрипта сформировался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru