Нет, стандартный способ сериализировать к JSON состоит в том, чтобы пользоваться существующей библиотекой сериализации JSON. Если Вы не хотите делать это, то Вы оказываетесь перед необходимостью писать свои собственные методы сериализации.
, Если Вы хотите руководство о том, как сделать это, я предложил бы исследовать источник некоторых доступных библиотек.
РЕДАКТИРОВАНИЕ: я не собираюсь выходить и говорить, что запись Ваших собственных serliazation методов плоха, но необходимо полагать, что, если для приложения важно использовать правильно построенный JSON, тогда необходимо взвесить издержки "еще одной зависимости" против возможности, что пользовательские методы могут однажды встретиться со случаем возникновения отказов, который Вы не ожидали. Приемлем ли тот риск, Ваш вызов.
Вот пара предложений (я действительно не знаю, что происходит и / или почему; так что это всего лишь предложения; может быть, один из них решит проблему ^^) .
Прежде всего, пара вопросов:
(Они имеют значение, по крайней мере, если ни одно из этих предложений не помогает)
var_dump ($ _ SESSION); die;
в конце сценария, который устанавливает данные в сеансе, что это дает? Первая идея: что, если вы установите какой-либо заголовок, чтобы отключить кеширование браузером?
Такие вещи, например:
session_start();
header("Cache-control: private");
Вторая идея (по крайней мере, если вы используете Windows): вы пробовали отключить антивирус / брандмауэр?
Правильно ли создается файл cookie сеанса в браузере клиента?
Если вы используете субдомены (или нет): в порядке ли домен cookie? Как насчет даты истечения срока его действия?
Третья идея:
error_reporting
установлен на E_ALL
, что хорошо display_errors
? Включено ли для него значение «Вкл.», Чтобы отображались ошибки? error_log PHP / Apache
?
Еще один вопрос: Вы уверены, что абсолютно ничего не попадает в вывод до начало_сеанса
? Даже пробелов нет?
Еще один вопрос: Вы уверены в разрешениях на каталоги / файлы?
Какие права доступа к каталогу сеанса и к (пустым) файлам, которые создаются?
У меня заканчиваются идеи ... Если повезет, может быть, один из них окажется подходящим ... Или поможет вам найти правильный вариант!
Удачи!
Посмотрите на свои настройки php.ini. В частности, вы хотите установить session.auto_start
равным 0, если вы вручную выполняете session_start ()
. А если вы полагаетесь на файл cookie сеанса или транспарантную перезапись URL, вам также понадобится session.use_cookies = 1
и / или session.use_trans_sid = 1
.
Похоже, cookie идентификатора сеанса не устанавливается
Убедитесь, что ваш session.save_dir установлен правильно. Если вы используете что-то вроде Media Temple, где вы размещены в home / #### / domains / html, это может быть неправильно настроено и не будет сохранено.
Я видел странные проблемы, возникающие, когда session_start () не была самой первой строкой кода на странице. Попробуйте переместить session_start () выше ваших include и requires и посмотрите, исправит ли это это.
сначала я предлагаю использовать
error_reporting (E_ALL);
в начале каждого файла
Во-вторых, я думаю, проблема в том, что вы включаете 2 session_starts, и что происходит, вы можете не отслеживать тот же session_id, который вы думаете.
Длинный план, но стоит упомянуть:
Правильно ли настроен PHP для обработки сеансов?
Что выводит phpinfo ()?
Идентификатор сеанса нигде не найден. Однажды у меня была эта проблема, сеансы создавались как сумасшедшие, но ничего не сохранялось. (также убедитесь, что у вас есть надлежащие права на запись в папку сеанса, когда-то тоже была проблема такого рода)
То, что вы ДЕЙСТВИТЕЛЬНО хотите сделать, это
$ sessionsid = session_start (); // для начала новой сессии и
session_start ($ sessionsid); // при стартовом запросе для каждого последующего вызова до тех пор, пока сеанс не будет уничтожен с помощью session_destroy ()
Конечно, передача переменной $ sessid между веб-страницами зависит от вас. Я предпочитаю использовать аддитивный & sessid = link;> (таким образом я сразу узнаю, что что-то пошло не так; P)
Помните, что единственный способ ОБЕСПЕЧИТЬ правильное восстановление сеанса - это передать идентификатор сеанса. Я знаю, что это необязательно, и в большинстве систем он должен работать сразу из коробки, но иногда это просто не так, и нет никакой гарантии относительно поведения сеанса на общем хостинге.
В качестве рекомендации попробуйте обернуть свои сеансы в класс с «волшебными» обработчиками по умолчанию для __set () и __get (), может облегчить вам жизнь позже для проверки данных сеанса (обработчик __call () особенно полезен для этого). И пусть конструктор класса ожидает идентификатор сеанса, где 0 (или -1, или что-то еще) означает «начать новый сеанс», и убедитесь, что он выдает ошибки, если идентификатор не установлен явно - это предупредит вас о очевидные
проблемы.
--------- [Edit
И о, я уже упоминал - в общей среде с множеством запросов пользователей, отсутствие явного именования сеансов может привести к сквозным проблемам (один пользователь входит в систему как другой). По большей части этого не происходит, но если у вас действительно испорченная конфигурация хостинга, отказ от именования сеансов и использование «поведения по умолчанию» может привести к нескольким катастрофам одновременно. ; -)
На основании комментария в документации PHP header () , я считаю, что вам нужно сделать следующее внизу вашего файла. header ('Location: x');
- это особый случай использования функции header ()
, и он может помешать прохождению сеанса, если у сеанса не было времени на запись ранее выполняется вызов header ()
. session_write_close () должен исправить это.
...
session_write_close();
header('Location: index.php');
Я протестировал код и даже скопировал настройки ini, которые у вас есть.
Я сделал несколько простых объектов для замены db и user. И из-за того, что сказал daremon , если какая-либо из проверок, связанных с пользователем и db, завершится неудачно, он все равно будет показывать пустую страницу индекса (Мой тестовый индекс распечатал содержимое суперглобального $ _SESSION).
Итак, возможно ли, что ошибка в классах db или user? Вы их тестировали? Чтобы увидеть, заключается ли проблема в этих классах, достаточно просто добавить exit после каждого вызова заголовка, как сказал daremon.
Я должен согласиться с тем, что Джейсон сказал ранее. Просто добавьте строку session_start ();
перед всем в сценарии входа в систему. Поместите его сразу после функции session_start () где угодно, даже не в заголовок.
Так что измените свой код следующим образом
<?
session_start();
if ($DEBUG == true) {
error_reporting(E_ALL);
}
, а затем оставшуюся часть кода ...
Надеюсь, это решит проблему.
Вероятная причина в том, что выполнение продолжается после операторов заголовка («Местоположение ...»). Однако похоже, что вы хотите, чтобы он остановился, поэтому вам следует добавить 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, несмотря ни на что.
Проверьте ваши включения на наличие завершающих строк. Иногда после закрытия?> Будет выводиться новая строка, что предотвратит создание сеанса. Это меня серьезно укусило, прежде чем я это понял.
Это не похоже на причину ваших проблем, но, поскольку вы еще не нашли решения, вы можете также проверить, использует ли ваш хост балансировку нагрузки без синхронизации данных сеанса. Это означает, что ваш пользователь может быть отправлен на другой сервер для каждого запроса, и если каталог данных сеанса не будет совместно использоваться всеми этими серверами, ваши данные сеанса будут потеряны.
Вероятно, здесь не так, но это вызвало у меня серьезный головная боль некоторое время назад, так что выкладываю на всякий случай.
Зайдите на этот сайт и загрузите готовую систему входа (отличный учебный сайт!), Она такая же, как ваша!
http://net.tutsplus.com/videos/screencasts/how-to-build-a-login-system-for-a-simple-website/
Это может не решить проблему вашего сеанса, но решит тему почти в равной степени; D
Прежде всего: На какой версии 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, а не во всем остальном коде.