PHP: $ _SESSION никогда не устанавливается, но $ _POST установлен ?

#php #session #superglobals

#php #сессия #суперглобальные

Вопрос:

[@замечания downvote и idiot, это не круто — избивать людей. Я перепроверял документацию и примечания к курсу целых 3 дня, прежде чем даже задать вопрос — . Закрываю это, чтобы предотвратить появление хора идиотов, набрасывающихся с бесполезными и фактически некорректными комментариями, как это сделал Джеймс. Спасибо Чарльзу и Бренту Би за то, что они были очень полезны. Оказывается, это не проблема Safari, поэтому я удалил эти теги.]


$ _SESSION не устанавливается в Safari, и, следовательно, моя многостраничная форма прерывается. $ _POST, $_REQUEST действительно устанавливаются (но, очевидно, исчезают на последующих страницах). Версии PHP: 5.3.1, Safari 5.

Помогите! Это не проблема ни с одним из следующих, я проверил их все, и я прочитал все другие связанные вопросы:

  • session_start() работает. SID / PHPSESSID сохраняется на всех страницах.
  • session.use_cookies = 1, session.use_only_cookies = 1
  • Я проверил php.ini и считаю, что все в порядке
  • Я настроил Safari на прием всех файлов cookie (на данный момент). Никакой разницы.
  • Я могу вручную установить $ _SESSION[‘debug’], и это сохраняется на разных страницах (и файл сеанса записывается правильно). Если я этого не сделаю, $ _SESSION никогда не будет определен.

У меня нет времени на отладку этой ерунды, так какое из следующих решений, принятых в последнюю минуту, наименее уродливое? (это назначение программирования, а не производственный код) Согласно примечаниям к курсу, $ _SESSION должен объединить $ _POST, $ _REQUEST, $ _GET, сессию и глобальные переменные, верно?

  1. вручную выполните $_SESSION = array_merge($_SESSION,$_POST); [это работает]
  2. используйте скрытую форму для повторного размещения $_POST в последующих формах
  3. другое?

(В более широком смысле, следует ли просто считать PHP сломанным в Safari (5)?)

Комментарии:

1. Вы тестируете с полным доменным именем, IP-адресом или localhost? В прошлом у Safari было много сложных проблем с приемом файлов cookie от объектов, которые не являются настоящими доменными именами, хотя я думал, что они исправили это некоторое время назад. Кроме того, $_GET / $_POST / $_REQUEST создаются на основе отправленных данных, в то время как $_SESSION они хранятся на диске, но упоминаются в файле cookie. Отсутствие сессионного cookie означает, что вы получаете пустой сеанс. Кроме того, что все они написаны заглавными буквами и начинаются с подчеркивания, эти суперглобальные значения не имеют ничего общего . Не объединяйте $_POST в $_SESSION , это глупо.

2. Да, с localhost (как я могу перепроверить точный адрес, который он видит? и это безопасно?) И есть файл cookie сеанса. session.cookie_domain не имеет значения.

3. Для display_errors установлено значение on, а для error_level — значение -1? Что в вашей переменной $ _COOKIES?

4. Вы не тестировали свой код в других браузерах, но говорите, что ваша проблема специфична для Safari ?

5. According to course notes, $_SESSION is supposed to merge ЛОЛ, я хотел бы прочитать эти заметки. Ожидал от этого большего удовольствия. Есть ли шанс, что вы пройдете этот курс 1 апреля? 😉

Ответ №1:

$ _SESSION НЕ объединяет другие супер глобальные массивы, это его собственный массив. $ _REQUEST — это слияние $ _POST и $ _GET, но не более того. Из того, что вы описываете, $ _SESSION работает должным образом. Прочитайте официальное руководство. http://www.php.net/manual/en/language.variables.superglobals.php

Комментарии:

1. Хорошо, моя ошибка. Но тогда в многостраничной форме нормально ли объявлять переменную $ _SESSION для каждой переменной, для которой одностраничная форма обычно использовала бы массив $ _POST? (очевидно, что это будет работать в этом коде, но есть ли какой-либо недостаток в создании нескольких переменных $ _SESSION?)

2. (Я запутался между $ _SESSION, $ _REQUEST и порядком ‘EGPCS’, я думал, что все было объединено в $ _SESSION . php.net/manual/en/ini.core.php#ini.variables-order )

3. Было бы проще просто сохранить $ _POST в переменной $_SESSION . Например, $_SESSION[‘page1_post’] = $_POST. Это позволило бы избежать конфликтов имен переменных.

4. @smci, «EGPCS», о котором вы упоминаете, является артефактом доисторического PHP. Раньше была вещь под названием register_globals , которая заставляла переменные запроса становиться реальными переменными в глобальной области видимости, вместо того, чтобы жить в массивах. Эта аббревиатура представляет порядок определения (или переопределения) этих переменных по умолчанию. Если в какой-либо документации, которая у вас есть, все еще упоминается этот термин, я очень настоятельно рекомендую отказаться от него и спросить того, кто дал его вам, почему они полагаются на историческую, неверную информацию в новом курсе. (продолжение)

5. @smci Существует только один суперглобальный файл, который объединяется в современном PHP: $_REQUEST . В более старых установках (до версии 5.3), $_REQUEST это комбинация get, post и cookie, в таком порядке. В версии 5.3 он был изменен по умолчанию на только get и post. Слава богу, это настраиваемая вещь. Обычно наличие cookie там не полезно.