Данные сессии PHP, не сохраненные

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

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

РЕДАКТИРОВАНИЕ: я не собираюсь выходить и говорить, что запись Ваших собственных serliazation методов плоха, но необходимо полагать, что, если для приложения важно использовать правильно построенный JSON, тогда необходимо взвесить издержки "еще одной зависимости" против возможности, что пользовательские методы могут однажды встретиться со случаем возникновения отказов, который Вы не ожидали. Приемлем ли тот риск, Ваш вызов.

9
задан The.Anti.9 30 July 2009 в 01:09
поделиться

16 ответов

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

Прежде всего, пара вопросов:
(Они имеют значение, по крайней мере, если ни одно из этих предложений не помогает)

  • Какую версию PHP / Apache вы используете?
  • Вы используете Windows? Linux?
  • Если вы находитесь на своем «рабочем» сервере, какую службу хостинга вы используете? Может быть, в этом есть что-то особенное?
  • Проблема присутствует у каждого ?
    • Всегда ли возникает проблема при просмотре сайта?
    • Присутствует ли она, когда вы заходите на сайт из другого браузера?
    • А как насчет с другого компьютера?
  • Если вы используете что-то вроде var_dump ($ _ SESSION); die; в конце сценария, который устанавливает данные в сеансе, что это дает?


Первая идея: что, если вы установите какой-либо заголовок, чтобы отключить кеширование браузером?
Такие вещи, например:

session_start();
header("Cache-control: private");


Вторая идея (по крайней мере, если вы используете Windows): вы пробовали отключить антивирус / брандмауэр?
Правильно ли создается файл cookie сеанса в браузере клиента?
Если вы используете субдомены (или нет): в порядке ли домен cookie? Как насчет даты истечения срока его действия?


Третья идея:

  • вы сказали, что error_reporting установлен на E_ALL , что хорошо
  • как насчет display_errors ? Включено ли для него значение «Вкл.», Чтобы отображались ошибки?
  • Есть ли что-нибудь интересное в error_log PHP / Apache ?


Еще один вопрос: Вы уверены, что абсолютно ничего не попадает в вывод до начало_сеанса ? Даже пробелов нет?


Еще один вопрос: Вы уверены в разрешениях на каталоги / файлы?

  • Разрешение на запись в каталог означает, что вы можете создавать новые файлы и / или удалять старые.
    • Но, если я правильно помню, вы не можете их изменять
  • Чтобы изменять файлы, вам также нужен доступ на запись к файлам
    • На самом деле, вашему веб-серверу нужен доступ на запись к этим файлам ^^

Какие права доступа к каталогу сеанса и к (пустым) файлам, которые создаются?


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

Удачи!

11
ответ дан 4 December 2019 в 06:49
поделиться

Посмотрите на свои настройки php.ini. В частности, вы хотите установить session.auto_start равным 0, если вы вручную выполняете session_start () . А если вы полагаетесь на файл cookie сеанса или транспарантную перезапись URL, вам также понадобится session.use_cookies = 1 и / или session.use_trans_sid = 1 .

0
ответ дан 4 December 2019 в 06:49
поделиться

Похоже, cookie идентификатора сеанса не устанавливается

0
ответ дан 4 December 2019 в 06:49
поделиться

Убедитесь, что ваш session.save_dir установлен правильно. Если вы используете что-то вроде Media Temple, где вы размещены в home / #### / domains / html, это может быть неправильно настроено и не будет сохранено.

0
ответ дан 4 December 2019 в 06:49
поделиться

Я видел странные проблемы, возникающие, когда session_start () не была самой первой строкой кода на странице. Попробуйте переместить session_start () выше ваших include и requires и посмотрите, исправит ли это это.

1
ответ дан 4 December 2019 в 06:49
поделиться
  • сначала я предлагаю использовать

    error_reporting (E_ALL);

    в начале каждого файла

  • Во-вторых, я думаю, проблема в том, что вы включаете 2 session_starts, и что происходит, вы можете не отслеживать тот же session_id, который вы думаете.

1
ответ дан 4 December 2019 в 06:49
поделиться

Длинный план, но стоит упомянуть:
Правильно ли настроен PHP для обработки сеансов?
Что выводит phpinfo ()?

2
ответ дан 4 December 2019 в 06:49
поделиться

Идентификатор сеанса нигде не найден. Однажды у меня была эта проблема, сеансы создавались как сумасшедшие, но ничего не сохранялось. (также убедитесь, что у вас есть надлежащие права на запись в папку сеанса, когда-то тоже была проблема такого рода)

То, что вы ДЕЙСТВИТЕЛЬНО хотите сделать, это

$ sessionsid = session_start (); // для начала новой сессии и

session_start ($ sessionsid); // при стартовом запросе для каждого последующего вызова до тех пор, пока сеанс не будет уничтожен с помощью session_destroy ()

Конечно, передача переменной $ sessid между веб-страницами зависит от вас. Я предпочитаю использовать аддитивный & sessid = link;> (таким образом я сразу узнаю, что что-то пошло не так; P)

Помните, что единственный способ ОБЕСПЕЧИТЬ правильное восстановление сеанса - это передать идентификатор сеанса. Я знаю, что это необязательно, и в большинстве систем он должен работать сразу из коробки, но иногда это просто не так, и нет никакой гарантии относительно поведения сеанса на общем хостинге.

В качестве рекомендации попробуйте обернуть свои сеансы в класс с «волшебными» обработчиками по умолчанию для __set () и __get (), может облегчить вам жизнь позже для проверки данных сеанса (обработчик __call () особенно полезен для этого). И пусть конструктор класса ожидает идентификатор сеанса, где 0 (или -1, или что-то еще) означает «начать новый сеанс», и убедитесь, что он выдает ошибки, если идентификатор не установлен явно - это предупредит вас о очевидные проблемы.

--------- [Edit

И о, я уже упоминал - в общей среде с множеством запросов пользователей, отсутствие явного именования сеансов может привести к сквозным проблемам (один пользователь входит в систему как другой). По большей части этого не происходит, но если у вас действительно испорченная конфигурация хостинга, отказ от именования сеансов и использование «поведения по умолчанию» может привести к нескольким катастрофам одновременно. ; -)

3
ответ дан 4 December 2019 в 06:49
поделиться

На основании комментария в документации PHP header () , я считаю, что вам нужно сделать следующее внизу вашего файла. header ('Location: x'); - это особый случай использования функции header () , и он может помешать прохождению сеанса, если у сеанса не было времени на запись ранее выполняется вызов header () . session_write_close () должен исправить это.

...    
session_write_close();
header('Location: index.php');
4
ответ дан 4 December 2019 в 06:49
поделиться

Я протестировал код и даже скопировал настройки ini, которые у вас есть.

Я сделал несколько простых объектов для замены db и user. И из-за того, что сказал daremon , если какая-либо из проверок, связанных с пользователем и db, завершится неудачно, он все равно будет показывать пустую страницу индекса (Мой тестовый индекс распечатал содержимое суперглобального $ _SESSION).

Итак, возможно ли, что ошибка в классах db или user? Вы их тестировали? Чтобы увидеть, заключается ли проблема в этих классах, достаточно просто добавить exit после каждого вызова заголовка, как сказал daremon.

1
ответ дан 4 December 2019 в 06:49
поделиться

Я должен согласиться с тем, что Джейсон сказал ранее. Просто добавьте строку session_start (); перед всем в сценарии входа в систему. Поместите его сразу после функции session_start () где угодно, даже не в заголовок.

Так что измените свой код следующим образом

<?
session_start();
if ($DEBUG == true) {
    error_reporting(E_ALL);
}

, а затем оставшуюся часть кода ...

Надеюсь, это решит проблему.

1
ответ дан 4 December 2019 в 06:49
поделиться

Вероятная причина в том, что выполнение продолжается после операторов заголовка («Местоположение ...»). Однако похоже, что вы хотите, чтобы он остановился, поэтому вам следует добавить 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, несмотря ни на что.

9
ответ дан 4 December 2019 в 06:49
поделиться

Проверьте ваши включения на наличие завершающих строк. Иногда после закрытия?> Будет выводиться новая строка, что предотвратит создание сеанса. Это меня серьезно укусило, прежде чем я это понял.

1
ответ дан 4 December 2019 в 06:49
поделиться

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

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

0
ответ дан 4 December 2019 в 06:49
поделиться

Зайдите на этот сайт и загрузите готовую систему входа (отличный учебный сайт!), Она такая же, как ваша!

http://net.tutsplus.com/videos/screencasts/how-to-build-a-login-system-for-a-simple-website/

Это может не решить проблему вашего сеанса, но решит тему почти в равной степени; D

0
ответ дан 4 December 2019 в 06:49
поделиться

Прежде всего: На какой версии PHP вы размещаете?

В версиях PHP <5.3.0 session_start () всегда будет возвращать TRUE, даже если запуск сеанса завершился неудачно. (См. Журнал изменений .)


Второе: Вы пробовали

require_once("header.php");

Третье: Вы должны изолировать проблему. Попробуйте следующее

  • Создайте новый файл с именем session_test.php, содержащий:

    if (isset ($ SESSION ['garbage']) &&! Empty ($ SESSION ['garbage'])) { echo 'Данные сеанса:'. $ SESSION ['мусор']; } else { $ SESSION ['garbage'] = 'Мне нравится торт'; echo 'Данные сеанса записаны'; } ?>
  • Перейдите по адресу http: //: /session_test.php в браузере

  • Что произойдет, если вы обновите страницу? (Также: ваши сеансы работают сейчас?)

Это позволит убедиться, что проблема в комбинации php / apache | IIS, а не во всем остальном коде.

0
ответ дан 4 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: