может ли переменная php $ _SESSION иметь числовой идентификатор, таким образом: $ _SESSION ['1234 ’] - PullRequest
3 голосов
/ 17 сентября 2011

Я сводил себя с этой проблемой.

Я создаю идентификатор сеанса динамически, чтобы сохранить состояние страницы при обновлении.

Если щелкнуть элемент страницы, я беру идентификатор элемента и передаю его моему сценарию на стороне сервера, который создает переменную сеанса:

$_SESSION[$id] = $id; 

Как ни странно, это работало лишь некоторое время, я сузил его до того факта, что некоторые элементы имеют чисто числовой идентификатор, а другие - нет:

if (is_numeric($id))
{
   $_SESSION[$id] = $id;
   $_SESSION['test'] = $id; 

}else{

   $_SESSION[$id] = $id;
};

В приведенном выше примере были видны только нечисловые идентификаторы сеанса. Например, я мог бы echo $_SESSION['test']; без каких-либо проблем.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 05 июля 2012

Клавиши верхнего уровня в $_SESSION не могут быть числовыми, но клавиши на более глубоком уровне могут.

Например.

$_SESSION['ids'][13] = $foo;
$_SESSION['ids'][666] = $bar;
3 голосов
/ 17 сентября 2011

из руководства: The keys in the $_SESSION associative array are subject to the same limitations as regular variable names in PHP, i.e. they cannot start with a number and must start with a letter or underscore. For more details see the section on variables in this manual.

Использование чисто цифровых клавиш в сеансе не будет работать. Если он числовой, вы можете попробовать поставить перед ним подчеркивание.

РЕДАКТИРОВАТЬ: Начиная с PHP 5.5.9 в октябре 2015 года, это, кажется, все еще верно, несмотря на то, что руководство больше не появляется.

Тестовый код:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

session_start();
$_SESSION['a123'] = 'a123';
$_SESSION['123'] = '123str';
$_SESSION[455] = '455int';
$_SESSION['_123'] = '_123';

Урожайность:

Примечание: Неизвестно: пропуск цифровой клавиши 123 в поле Неизвестно в строке 0

Примечание: Неизвестно: пропуск цифровой клавиши 455 в поле Неизвестно в строке 0

Тогда var_dump($_SESSION); показывает только:

array(2) {
  ["a123"]=>
  string(4) "a123"
  ["_123"]=>
  string(4) "_123"
}

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

2 голосов
/ 17 сентября 2011

Неправильно иметь полностью числовой идентификатор элемента (например, <div id="123">) - вы должны поместить хотя бы один буквенный символ, например, <div id="e123">.Это должно решить вашу проблему - в качестве альтернативы вы можете просто добавить альфа-символ при создании сеанса, а затем удалить его, если страница обновлена:

$_SESSION[$id] = substr($str, 0, 1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...