2010-01-28 4 views
2

У меня есть система проверки подлинности PHP на моем сайте с использованием переменной $ _SESSION.Данные PHP SESSION, потерянные между загрузками страниц с помощью WAMPserver 2.0 на localhost

Форма отправляет имя пользователя и пароль в файл «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?

+0

Вы проверили заголовки, исходящие с вашего сервера, что на самом деле они содержат файл cookie сеанса? –

+0

Когда я делаю print_r ($ _ SESSION), ничего не отображается. Как проверить исходные заголовки? – thomaspaulb

+0

Вы можете сделать это с расширениями Firefox Firebug или Live http headers или использовать сетевой сниффер. –

ответ

0

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

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

Решение:

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

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

Благодаря Marcin Wiazowski who posted it here.

2

Прежде всего: индекс 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. Если вы назовете ввод-ввод чего-то вроде login_submit, вы можете позволить обработать проверку login.inc.php.

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

+0

«logedin» - это унаследованная опечатка от предыдущего разработчика, работающего над этим проектом. – thomaspaulb

+0

Спасибо .. Я реализовал ваш подход, код теперь намного более аккуратный, и логин переходит на фактическую страницу вместо того, чтобы делать перенаправление. Хотя я все еще не уверен, что вызвало проблему, у меня есть решение, и это самое главное! – thomaspaulb

1

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

if($_POST){...} 

с

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

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

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

+0

спасибо .. Я уже был занят реализацией подхода Мартьяна, наткнулся на строку if ($ POST) {...} и исправил ее сам. Приятно, что вы также упомянули об этом. Я также проверю отсутствие вызовов выхода. – thomaspaulb

1

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

session.use_only_cookies = 1 

в

session.use_only_cookies = 0 

Объяснение

Использование сеансов по умолчанию печенья на основе работает, как ожидалось, но Мне понадобилось решение без печенья. Тест начальная страница:

<?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 

решить эту проблему.

6

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 - нагрузки $_SESSION вар.

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

0

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

session_regenerate_id(true); 

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

0

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