У меня самая странная проблема с самим PHP, что я когда-либо видел.
Настроить:
PHP 5.33, (также пробовал PHP 5.2.14) в IIS
Проблема: PHP удаляет все данные сеанса, как только я помещаю восклицательный знак в ключ в массиве сеансов.
Пример:
session1.php
session_start(); $_SESSION["foo"] = 'test'; header('Location: session2.php');
session2.php
session_start(); var_dump($_SESSION); die();
Хорошо работает, я вижу распечатку переменных данных.
array(1) { ["foo"]=> &string(4) "test" }
Но если я изменю строку в первом файле,
$_SESSION["foo!"] = 'test';
или
$_SESSION["f!oo"] = 'test';
Я имею в виду, если я добавлю восклицательный знак, тогда массив $ _SESSION пуст, когда я получу второй файл
array(0) { }
Я думал, что это багги версия PHP, когда я был на 5.2.14, но обновление не помогло. Я даже не знаю, в чем проблема. Может быть, это как-то связано с установкой Windows или IIS?
Есть идеи?
хорошо, о чём вы спрашиваете? в чем причина этой ошибки или как ее избежать?
Первая из них, вероятно, связана с некоторыми нечетными внутренними PHP. Например, вы не можете использовать цифровые клавиши с такими же последствиями.
Последний еще проще – не помещайте восклицательный знак в ключ в массиве сеанса.
Насколько я помню, механизм PHP-сессий возник из PHPLib – первой основы PHP. Написанные некоторыми добровольцами. Не очень оптимальный. После добавления к PHP в версии 4.0 можно использовать только в формате 4.1, но все же с некоторым нечетным наследием, например, с поддержкой register_globals. Последнее, скорее всего, является причиной вашей проблемы. Ключ массива $ _SESSION должен быть действительным именем переменной PHP для этого древнего поведения register_globals, где переменные сеанса становятся глобальными переменными PHP.
Это не Windows , это не Apache или какой-либо другой веб-сервер, это ядро PHP.
Я посмотрел на него – начиная с 5.3 до 5.6, и проблема все еще существует: вам не разрешено иметь «!» (восклицательный знак) или «|» (труба) внутри ключа сеанса.
Патч Suhosin исправит его частично. Затем вам разрешается иметь восклицательный знак в любом положении внутри вашего ключа, но не на первой позиции, поэтому «foo!» разрешено, но не «! foo». Труба по-прежнему запрещена.
Исправление:
Повеселись!