2013-03-04 4 views
2

Я хочу изменить имя сеанса & идентификатор сеанса в моей панели входа администратора. В моей панели администратора cookie установлены только httpсеанс не задается при изменении имени сеанса и идентификатора сеанса

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

коды index.php

<?php 
session_name("websitename");//session name changed 
if (session_start()) { 
    session_regenerate_id(true);//session id changed 
    //$sess_name=session_name(); 
    setcookie("websitename", session_id(), null, '/', null, null, true);//set cookie httponly 
} 

$_SESSION['admin']="login"; 
header("Location: home.php"); 
?> 

...................... .................................................. ...................

home.php

<?php 
session_start(); 
if(!isset($_SESSION['admin'])) 
echo "you are logout"; 
else 
echo "you are in home"; 
?> 

сайт печати 'вы выйти из системы'

+2

Идея именования сеансов заключается в разделении сеансов друг от друга (в основном, когда вы запускаете два или более проектов, которые используют сеансы на одной машине). поэтому сеанс с именем 'name1' не передает никакой информации с сеансом с именем' name2'. – Leri

ответ

5

Короткий ответ заключается в том, чтобы вставить строку: session_name ("websitename"); как первая строка home.php

Почему? Для тех, кто оказался здесь, пытаясь понять разницу между session_name и session_id в PHP, я предлагаю следующее объяснение:

Данные сеанса в том, что я назову «хранилищем данных» на сервере PHP. Как правило, это файл на диске, но он может быть такой же базой в зависимости от того, как PHP и приложение реализованы на вашем конкретном сервере (PHP позволяет приложениям переходить на хранение сеанса, предоставленное изначально.

Данные сеанса в виде «рваного массива».

Оборванец массив хранится в хранилище данных с помощью ключа, который является уникальным для каждой сессии.

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

Что происходит в индексе .php в приведенном выше примере:

  1. Вы выполните session_name(); Что говорит PHP не использовать имя сеанса по умолчанию (PHPSESSID) для доступа к данным cookie, но вместо этого использовать имя сайта
  2. Вы выполните session_start(); PHP ищет куки, отправленные из браузера с ключевым именем «веб-сайта». Он не находит его, поэтому он создает новый сеанс, генерируя случайный идентификатор сеанса (назовем его «A1»; он хранит новый идентификатор сеанса в файле cookie с ключом «websitename»; инициализирует данные сеанса пустой массив. (как если бы вы сделали $ _SESSION = array();)
  3. У вас есть оператор if, где вы проверяете, был ли сеанс запущен. То, как вы используете это, является нечетным. Если сеанс действительно начался, повторите большую часть того, что сеанс сеанса просто сделал для вас (все, кроме инициализации массива). В этом случае допустим, что новый, восстановленный идентификатор сеанса os «B2». Но затем вы проваливаете и выполняете еще два оператора, которые не делают любой смысл, если сеанс не запустился. Если сеанс не начал устанавливать ключ администратора в $ _SESSION, это бессмысленно, поскольку перенаправляется на home.php, который зависит от успешного инициализации сеанса index.php. Мне больше смысла что если сбой сеанса завершен, вы регистрируете mes мудрец к системному администратору или самому себе, что сайт настроен неправильно. Если сайт настроен для сеансов, запуск сеанса всегда будет возвращать значение true.
  4. Теперь вы установите переменную сеанса с ключом «admin» на значение «login», сделав его элементом супер глобального массива $ _SESSION.
  5. Когда вы проваливаетесь в нижней части index.php (выходите из него), PHP записывает текущее содержимое массива $ _SESSION в хранилище данных, используя ключ, который находится в файле cookie (то есть, «B2», где могут быть найдены другие скрипты это. данные сеанса хранятся в хранилище usng ключ «B2» является $ _SESSION массив с одним элементом с ключом «админ» и значение «Вход»

Когда вы исследуете ваш код в домашних условиях. PHP Я считаю, что это то, что происходит:..

  1. вы делаете session_start() Потому что вы не делали перед session_name(), PHP использует имя по умолчанию PHPSESSID PHP ищет cookie, отправленный из браузера ключом вашего имени сеанса (PHPSESSID) и не находит его. Таким образом, он создает новый сеанс. Он генерирует новый случайный идентификатор сеанса для сеанса, назовем его «C3»; он инициализирует данные сеанса ($ _SESSION) пустующему массиву и создает куки-файл с ключом PHPSESSID и значением идентификатора случайного сеанса, созданного для вашего сеанса («C3»).
  2. Вы делаете if/else, где вы проверяете, есть ли у данных сеанса элемент с ключом «admin». Массив сеанса пуст, поэтому если else выбирает ложную ветвь и печатает, что пользователь не вошел в систему.

Ваш код более сложный, чем это из-за «if» в index.php, но для упрощения issue:

Вы сохранили свое значение администратора в хранилище данных сеанса, используя ключ «B2», а затем искали его в home.php с ключом «C3» и не смогли найти его. Это связано с тем, что вы используете имя сеанса «websitename» в index.php, но используете имя сеанса «PHPSESSIONID» в home.php. Если вы посмотрите на файлы cookie, используя вкладку ресурсов инструментов разработчика Chrome, вы увидите файлы cookie для «websitename» и «PHPSESSIONID». В инструментах разработчика куки будут отображать реальные, случайные, идентификаторы сеанса (26 символов) вместо двух идентификаторов сеанса символов, которые я составил для этого обсуждения.

+0

Это один из лучших ответов, которые я видел в sof. – shan

Смежные вопросы