#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, сессию и глобальные переменные, верно?
- вручную выполните $_SESSION = array_merge($_SESSION,$_POST); [это работает]
- используйте скрытую форму для повторного размещения $_POST в последующих формах
- другое?
(В более широком смысле, следует ли просто считать 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 там не полезно.