Я создаю систему входа в систему, но когда пользователь входит в систему, на самом деле она не хранит ни одну из данных, которые я хочу в сеансе. Я даже проверил файл сеанса, и он был пуст. У меня есть session_start (); на всех страницах. что еще я могу делать неправильно. Вот код для двух основных страниц.
код входа:
<? if ($DEBUG == true) { error_reporting(E_ALL); } require "header.php"; require_once "dbinterface.php"; require_once "user.class.php"; require_once "config.inc.php"; $db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']); $u_result = $db->run("select user_id from users where user_name = '" . $db->escape($_POST['user_name']) . "'"); if ($u_result == false) { $url = 'Location: error.php?id=8'; header($url); } if (count($u_result) < 1) { $url = 'Location: error.php?id=3'; header($url); } $user = new user($u_result[0]['user_id']); if ($user->match_password($_POST['pass']) == true) { $_SESSION['authenticated'] = true; $_SESSION['user_id'] = $u_result[0]['user_id']; $_SESSION['user'] = $user; } else { $url = 'Location: error.php?id=4'; header($url); } session_write_close(); header('Location: index.php'); ?>
Заголовок, который входит в каждую страницу:
<?php if (!session_start()) { $url = "Location: error.php?id=13"; header($url); } ?>
Немного фона:
Вот несколько предложений (я действительно не знаю, что происходит и / или почему, поэтому они являются только предложениями, возможно, кто-то решит проблему ^^) .
Прежде всего, пару вопросов:
(Они имеют значение, по крайней мере, если ни одно из этих предложений не делает трюк)
var_dump($_SESSION); die;
var_dump($_SESSION); die;
в конце скрипта, который устанавливает данные в сеансе, что он дает? Первая идея: что, если вы установите некоторый заголовок, чтобы отключить кеширование браузером?
Например, такие вещи, как:
session_start(); header("Cache-control: private");
Вторая идея (по крайней мере, если вы на окнах): вы пытались отключить антивирус / брандмауэр?
Правильно ли создан файл cookie сеанса в браузере клиента?
Если вы используете поддомены (или нет): является ли домен cookie ОК? Как насчет даты истечения срока?
Третья идея:
error_reporting
установлен в E_ALL
, что приятно display_errors
? Установлено ли значение On, чтобы отображались ошибки? error_log
? Еще один: вы уверены, что нет абсолютно ничего, что попадает на выход до session_start
? Даже белые пробелы?
Еще один: вы уверены в разрешениях на каталоги / файлы?
Каковы разрешения в каталоге сеанса и на (пустых) файлах, которые создаются?
У меня заканчиваются идеи … Немного удачи, возможно, один из них будет правильным … Или помогите вам узнать, какой будет правильный!
Удачи !
Вероятная причина заключается в том, что выполнение продолжается после заголовков («Местоположение …»). Однако похоже, что вы хотите, чтобы он остановился, поэтому вы должны добавить 'exit;' после перенаправления на error.php. Например:
if ($u_result == false) { $url = 'Location: error.php?id=8'; header($url); exit; }
Это также может быть частью вашей проблемы, так как вы никогда не заходите в error.php и не видите код ошибки. Последняя строка всегда выполняется:
header('Location: index.php');
И поскольку поведение по умолчанию header () заключается в замене существующих заголовков, вы всегда обращаетесь к index.php независимо от того, что.
Основываясь на комментарии в документации PHP header () , я считаю, что вам нужно сделать следующее в нижней части файла. header('Location: x');
является особым случаем использования функции header()
, и он может помешать передаче сеанса, если сеанс не успел написать перед вызовом header()
. session_write_close () должен исправить это.
... session_write_close(); header('Location: index.php');
SessionID нигде не встречается. У меня была эта проблема один раз, сеансы создавались как сумасшедшие, но ничего не хранили. (также убедитесь, что у вас есть надлежащие права на запись в папку сеанса, как только была проблема такого рода)
То, что вы действительно хотите сделать, – это
$ sessid = session_start (); // для начала нового сеанса и
session_start ($ sessid); // в начале запроса для каждого последующего вызова до тех пор, пока сеанс не будет уничтожен с помощью session_destroy ()
Конечно, передача переменной $ sessid между веб-страницами зависит от вас. Я предпочитаю использовать a & sessid = link additive;> (таким образом я сразу же знаю, когда что-то пошло не так, P)
Помните, что единственный способ ОБЕСПЕЧИТЬ правильное восстановление сеанса – передать идентификатор сеанса. Я знаю, что это необязательно, и в большинстве систем он должен просто работать из коробки, но иногда это просто не так, и просто нет гарантии о поведении сеансов на общем хостинге.
Подобно тому, как пробовать, попробуйте обернуть свои сеансы в классе с помощью «волшебных» обработчиков по умолчанию для __set () и __get (), может сделать вашу жизнь немного легче для проверки данных сеанса (обработчик __call () полезен для этого). И сделайте конструктор класса ожидающим идентификатор сеанса, с 0 (или -1 или что-то еще), который будет «запускать новый сеанс», и убедитесь, что он кричит об ошибках, если идентификатор не установлен явно – это будет предупреждать вас о obvious
проблемы.
———[ Редактировать
И о, я упомянул – в общей среде с множеством пользовательских запросов, не называя ваши сессии явно, может привести к проблемам с кровотечением (один пользователь входит в систему как другой). По большей части этого не происходит, но если у вас есть действительно запущенная конфигурация хостинга, а не называть ваши сессии и полагаться на «поведение по умолчанию», это может привести к нескольким катастрофам одновременно. 😉
Длинный выстрел, но стоит упомянуть:
Правильно ли настроен PHP для обработки сеансов?
Что такое вывод phpinfo ()?
сначала я предлагаю использовать
error_reporting (E_ALL);
в начале каждого файла
Во-вторых, я думаю, проблема состоит в том, что вы включаете 2 session_starts и что происходит, это то, что вы не можете отслеживать тот же session_id, который вы считаете.
Я видел странные проблемы, когда session_start () не является самой первой строкой кода на странице. Попробуйте переместить свой session_start () над вашим включением и требует и посмотреть, исправляет ли он это.
Я должен согласиться с тем, что сказал Джейсон ранее. Просто добавьте session_start();
строка перед всем в скрипте входа. Поместите его сразу после функции session_start () в любом месте, даже в заголовке.
Так измените свой код, как это
<? session_start(); if ($DEBUG == true) { error_reporting(E_ALL); }
после чего остальная часть вашего кода …
Надеюсь, это решит проблему.
Проверьте, что включает в себя следующие линии. Когда-нибудь выйдет новая строка после закрытия?> И запретит создание сеанса. Мне это очень понравилось, прежде чем я понял это.
Я тестировал код и даже реплицировал настройки ini, которые у вас есть.
Я сделал несколько простых объектов для замены db и пользователя. И из-за того, что сказал daremon , если какая-либо проверка, связанная с сбоем пользователя и db, будет по-прежнему отображаться с пустой индексной страницей (мой тестовый индекс напечатал содержимое супергеллона $ _SESSION).
Итак, возможно ли, что ошибка находится в классах db или пользователя? Вы тестировали их? Чтобы узнать, не лежит ли проблема в этих классах, просто вопрос добавления выхода после каждого вызова заголовка, например, daremon.
Убедитесь, что ваш session.save_dir установлен правильно. Если вы находитесь на чем-то вроде Media Temple, где вы размещены в доме / #### / domains / html, он может быть установлен неправильно и не будет сохранен.
Похоже, cookie sessionID не устанавливается
Посмотрите настройки своего php.ini. В частности, вы хотите установить session.auto_start
в 0, если вы вручную выполняете session_start()
. И если вы полагаетесь на cookie сеанса или прозрачную переписывание URL-адресов, вам понадобятся session.use_cookies=1
и / или session.use_trans_sid=1
.
Прежде всего: какую версию PHP вы принимаете?
В версиях PHP <5.3.0 session_start () всегда возвращает TRUE, даже если запуск сеанса не выполняется. (См. Журнал изменений .)
Второе: вы пробовали
require_once("header.php");
В-третьих: Вы должны изолировать проблему. Попробуйте следующее
Создайте новый файл session_test.php, содержащий:
if( isset($SESSION['garbage']) && !empty($SESSION['garbage']) ) { echo 'Session data: ' . $SESSION['garbage']; } else { $SESSION['garbage'] = 'I like cake'; echo 'Session data written'; }
if( isset($SESSION['garbage']) && !empty($SESSION['garbage']) ) { echo 'Session data: ' . $SESSION['garbage']; } else { $SESSION['garbage'] = 'I like cake'; echo 'Session data written'; }
?>
Перейдите в http: //: /session_test.php в браузере.
Это позволит убедиться, что проблема заключается в комбинации php / apache | IIS, а не во всем другом коде.
Это не похоже на причину ваших проблем, но, поскольку вы еще не нашли решения, вы можете также проверить, использует ли ваш хост балансировку нагрузки без синхронизации данных сеанса. Это означает, что ваш пользователь может быть отправлен на другой сервер для каждого запроса, и если каталог данных сеанса не будет разделен на всех этих серверах, ваши данные сеанса будут потеряны.
Вероятно, здесь не так, но это вызвало у меня серьезную головную боль некоторое время назад, поэтому я отправляю его на всякий случай.
Перейдите на этот сайт и загрузите законченную систему входа (отличный учебный сайт!), Это то же самое, что и ваш!
http://net.tutsplus.com/videos/screencasts/how-to-build-a-login-system-for-a-simple-website/
Он может не отвечать на вашу проблему с сеансом, но решить эту тему почти одинаково; D
У меня была такая же проблема. Мое решение было немного иначе, чем остальные. В моем файле php.ini
меня была эта настройка register_globals=On
.
И в моем коде можно сказать, что у меня был $_SESSION['user']
а позже в моем коде был присвоен что-то $user
он фактически заменил мою $_SESSION['user']
информацию тем, что я назначал $user
.
Поэтому либо убедитесь, что register_globals
отключен, либо измените имена переменных. = D
Дисковое пространство может быть и одной из проблем, не забудьте проверить свое дисковое пространство, если оно заполнено, оно не может быть записано.