Проблема с системой входа на основе PHP-сессии - PullRequest
1 голос
/ 23 февраля 2012

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

Редактировать: добавлено start_session, но оно все еще пусто

<?php 
 session_start();
 ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

...

$row = mysql_fetch_row($sql_result);

                            $_SESSION['id']= $row[0];
                            $_SESSION['uname'] = $row[1];
                            $_SESSION['pass'] = $row[2];
                            session_write_close(); <-- now removed, but the session is still empty


                            echo  $row[1] . "Login accepted.<br />";

Это код для создания сеанса.все строки учтены, и код вызывается, но сеанс все равно оказывается пустым.

if(empty($_SESSION['uname'])) echo 'empty session';

Также отметим, что firebug сообщает 0 объектов, сохраненных в sessionstorage.

Ответы [ 4 ]

2 голосов
/ 23 февраля 2012

Удалить session_write_close()

session_write_close() завершает сеанс:

Завершить текущий сеанс и сохранить данные сеанса.

Любые последующие вызовы $_SESSION не вернут никаких данных, так как сеанс был записан, а затем закрыт.

Как правило, вы не будете вызывать session_write_close() до тех пор, пока не выполните перенаправление header('Location: http://example.org'). Поскольку это не так в вашем коде, вы должны удалить его.

Убедитесь, что вы звоните session_start()

Я предполагаю, что вы вызываете session_start() на вершине всех ваших сценариев.

Проверь свою сессию

Чтобы проверить, работает ли ваш сеанс, я предлагаю реализовать следующий тестовый скрипт:

<?php
session_start();
$_SESSION['test'] = 'Hello';
echo $_SESSION['test'] . ' World!';
// you should get: Hello World!

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

Сеанс PHP и путаница с хранилищем HTML5

Они не одно и то же. Сессии PHP хранятся на сервере, в то время как браузер хранит сессии HTML5 локально в браузере. HTML5 sessionstorage - это хранилище информации на стороне клиента, которое сохраняется только в течение этого сеанса. См. w3c спецификацию для получения дополнительной информации.

PHP $_SESSION не сохраняется и не влияет на данные в хранилище сессии HTML5.

1 голос
/ 23 февраля 2012

С http://php.net/manual/en/function.session-write-close.php:

Завершить текущий сеанс и сохранить данные сеанса.

Данные сеанса обычно сохраняются после того, как ваш скрипт завершается без необходимость вызова session_write_close () [...]

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

Вы также забыли позвонить session_start() (или включить его в фрагмент кода, который вы разместили).

0 голосов
/ 23 февраля 2012

Хорошо, я понял это.По-видимому, мне нужно вызвать start_session () вверху ЛЮБОЙ СТРАНИЦЫ, КОТОРОЙ ИСПОЛЬЗУЕТСЯ ИНФОРМАЦИЯ О СЕССИИ, а не только страница, которая создает сеанс.Спасибо всем за помощь.

0 голосов
/ 23 февраля 2012

Прежде чем вы сможете начать хранить пользовательскую информацию в вашем сеансе PHP, вы должны сначала запустить сеанс.Когда вы начинаете сеанс, он должен находиться в самом начале вашего кода, перед отправкой любого HTML или текста.

например

<?php
session_start(); // start up your PHP session! 
?>

Этот крошечный фрагмент кода зарегистрирует пользователясеанс с сервером, позволяет начать сохранение информации о пользователе и назначить UID (уникальный идентификационный номер) для сеанса этого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...