Данные PHP SESSION, потерянные между загрузками страниц с WAMPserver 2.0 на localhost

У меня есть система проверки подлинности PHP на моем сайте, используя переменную $ _SESSION.

Форма отправляет имя пользователя и пароль в файл «login.php». Он обрабатывается следующим образом:

<?php include '../includes/sessionstart.inc.php'; ?> <?php ob_start(); ?> if($_POST){ $q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'"); if(mysql_num_rows($q) >= 1){ $f = mysql_fetch_Array($q); $_SESSION['company'] = $f['company']; $_SESSION['id'] = $f['id']; $_SESSION['logedin'] = true; session_write_close(); ob_clean(); header("Location: index.php"); } 

Затем загружается index.php и проверяется, является ли «logedin» истинным.

 <?php include '../includes/sessionstart.inc.php'; ?> <?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?> 

На моем рабочем сервере он продолжается, но на моем Wampserver он возвращается обратно в login.php. Я замечаю, что Wampserver очень медленно загружает страницы, это может что-то с этим сделать. Вот почему я включил session_write_close, чтобы убедиться, что данные сеанса сохранены до переключения страниц, но это не помогает.

Содержимое session_start.inc.php просто:

 <?php session_start(); ?> 

Раньше у меня было больше кода, но на данный момент это именно так. Проблема также существовала до того, как я начал использовать файл include.

Кто-нибудь знает, что я делаю неправильно? Почему Wampserver не передает мои данные SESSION в следующий файл PHP?

Solutions Collecting From Web of "Данные PHP SESSION, потерянные между загрузками страниц с WAMPserver 2.0 на localhost"

WAMP server 2 – настройки по умолчанию не заданы для $_SESSION var.

PHP.ini требует следующих настроек:

 C:\wamp\bin\apache\apache2.4.2\bin\php.ini session.cookie_domain = session.use_cookies = 1 session.save_path = "c:\wamp\tmp" ;ensure the \ is used not / 

Тестирование сеанса – load.php – load $_SESSION var.

 <?PHP session_start(); $_SESSION['SESS_MEMBER_ID'] = 'stored variable'; session_write_close(); header("location:print.php"); ?> 

print.php – print $ _SESSION var.

 <?PHP session_start(); var_dump($_SESSION); ?> 

запустите скрипт в своем браузере var_dump() чтобы создать результаты

перейдите к c:\wamp\tmp файлы, содержащие данные сеанса.

Прежде всего: индекс logedin кажется странным для отслеживания входа пользователя в систему. Является ли это просто опечаткой на SO или действительно кодовой опечаткой?

Во-вторых (в зависимости от желаемого поведения) попробуйте другой подход для защиты страниц. Ваша страница должна выглядеть примерно так:

 <?php include 'login.inc.php'; if(authorized()) { // put some more script here, if needed ?> // put some plain HTML here <?php } ?> 

Где login.inc.php обрабатывает сеанс, файлы cookie. В частности, authorized функция должна возвращать TRUE, если клиент уже зарегистрирован. Если клиент не зарегистрирован, он должен отображать форму с действием $_SERVER['PHP_SELF'] и возвращать FALSE. Если вы login_submit submit-input что-то вроде login_submit , вы можете позволить login.inc.php обрабатывать проверку.

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

Попробуйте заменить

 if($_POST){...} 

с

 if( isset($_POST['username']) && isset($_POST['password']) ){...} 

… по крайней мере для целей отладки. Вполне возможно, что некоторые разные настройки вызывают непустой массив $ _POST, где этого не ожидается.

Кроме того, ваш код, кажется, пропускает вызовы exit() после перенаправления header() . Отправка заголовка HTTP-заголовка автоматически не останавливает ваш скрипт.

У меня была эта проблема с использованием WAMPSERVER для разработки на / localhost. Мне нужно было изменить session.use_only_cookies как в строке, так и в настройке php.ini из

 session.use_only_cookies = 1 

в

 session.use_only_cookies = 0 

объяснение

Использование сессий по умолчанию, основанных на файлах cookie, работало так, как ожидалось, но мне понадобилось решение без cookie. Начальная страница теста:

 <?php // page1.php ini_set('session.use_cookies', '0'); session_start(); $_SESSION['time'] = time(); echo '<br /><a href="page2.php?' . SID . '">page 2</a>'; ?> 

Данные сеанса были созданы и сохранены в каталоге temp WAMPSERVER, например C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16 . Ссылка, сгенерированная вышеуказанным кодом, похожа на (обратите внимание, что UID соответствует имени файла данных сеанса):

page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16

Но пункт назначения page2.php выбрасывал неопределенные ошибки для переменной «время», пытаясь извлечь данные сеанса:

 <?php // page2.php ini_set('session.use_cookies', '0'); session_start(); echo date('Y md H:i:s', $_SESSION['time']); echo '<br /><a href="page1.php?' . SID . '">page 1</a>'; ?> 

Установив session.use_only_cookies FALSE в скрипте перед session_start(); :

 ini_set('session.use_only_cookies', '0'); 

или изменить его глобально в php.ini :

 ; This option forces PHP to fetch and use a cookie for storing and maintaining ; the session id. We encourage this operation as it's very helpful in combatting ; session hijacking when not specifying and managing your own session id. It is ; not the end all be all of session hijacking defense, but it's a good start. ; http://php.net/session.use-only-cookies session.use_only_cookies = 0 

решил проблему.

Спустя долгое время я исправил эту ошибку.

На моем localhost WAMP данные сеанса не сохраняются между загрузками страниц, поскольку данные сеанса хранятся в файле cookie, и для локального хоста не существует домена cookie.

Решение:

«session.cookie_domain» должен быть установлен в пустую строку для всех локальных доменных имен, а не только для «localhost» (но не должен быть пустым для локальных IP-адресов):

 <?php ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : ''); ?> 

Спасибо Marcin Wiazowski, который разместил его здесь .

Столкнулась с той же проблемой, но это вызвано

 session_regenerate_id(true); 

Поэтому я просто удалил его из своего кода.

Обновите WAMP 2.5, и теперь проблема решена!