Данные PHP SESSION теряются между загрузками страниц с помощью WAMPserver 2.0 на локальном хосте - PullRequest
2 голосов
/ 28 января 2010

У меня на сайте установлена ​​система аутентификации 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();
?>

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

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

Ответы [ 7 ]

6 голосов
/ 29 ноября 2012

WAMP сервер 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 Здесь появятся файлы, содержащие данные сеанса.

2 голосов
/ 28 января 2010

Прежде всего: индекс 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 обрабатывает сессию, куки. В частности, функция authorized должна возвращать TRUE, если клиент уже вошел в систему. Если клиент не вошел в систему, она должна отобразить форму с действием $_SERVER['PHP_SELF'] и вернуть FALSE. Если вы называете submit-input чем-то вроде login_submit, вы можете позволить login.inc.php обработать проверку.

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

1 голос
/ 07 декабря 2011

У меня была эта проблема при использовании 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>';
?>

Данные сеанса были созданы и успешно сохранены во временном каталоге 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 m d 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

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

1 голос
/ 28 января 2010

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

if($_POST){...}

с

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

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

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

0 голосов
/ 19 мая 2015

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

0 голосов
/ 02 августа 2014

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

session_regenerate_id(true);

Так что я просто удалил его из своего кода.

0 голосов
/ 25 августа 2010

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

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

Решение:

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

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

Спасибо Марцину Вязовскому , который разместил его здесь .

...