PHP логика для session_id () и session_start () - PullRequest
9 голосов
/ 29 июля 2011

Я унаследовал следующий код, который интересен .Логика кажется либо избыточной, либо совершенно неправильной.

// make the use of sessions possible.
if (!session_id()) {
    session_start();
}

Однако это крупномасштабная система подписчиков, и я не хочу ее менять.Несмотря на опыт работы с PHP, я был бы признателен за вклад сообщества, чтобы убедиться, что я ничего не пропустил.

Бонусные баллы, если вы можете упомянуть побочные эффекты или понимание текущего кода.

ОБНОВЛЕНИЕ

Может быть логика было не подходящим словом.Зачем проверять session_id() перед вызовом session_start(), когда он всегда будет возвращать пустую строку, поскольку нигде в коде не вызывается session_start().

Ответы [ 4 ]

13 голосов
/ 29 июля 2011

Этот код необходим для проверки, если сессия уже началась.Если сеанс запущен, нет необходимости инициализировать его снова.Кроме того, попытка вызвать session_start (), когда сессия уже инициализирована, приведет к ошибке E_NOTICE.

4 голосов
/ 29 июля 2011

Просмотр PHP.net:
http://php.net/manual/en/function.session-id.php

session_id () возвращает идентификатор сеанса для текущего сеанса или пустую строку (""), если текущий сеанс отсутствует(идентификатор текущей сессии не существует).

Если бы вы обновляли код, не меняя слишком много, вероятно, было бы лучше написать:

if (session_id() === "") {
   session_start();
}

, чтобы проверить, чтобы увидетьбыл ли сеанс действительно запущен или нет.Если прокомментировать и сослаться на документ php.net, было бы намного яснее увидеть, что разработчик пытается достичь.

Просто на заметку, пока:

$test = ""
!$test // This returns true    

Это не так ясно.

1 голос
/ 29 июля 2011

Особенно в старом коде, где включаемые файлы служат функциями (как я уже видел) или аналогичными решениями, один кусок кода вполне может сделать несколько разных вещей: инициализировать новый сеанс или установить новые значения.

Этот код можно использовать для проверки, если сеансы уже запущены. Это может быть, например, проверка данных сеанса или что-то совершенно не связанное с сеансами, но то, что требует сеансов.

Это, конечно, означает, что программист знал, что она делает. В большинстве случаев решения такого рода обусловлены тем, что программист просто копирует код из старой кодовой базы или, что более вероятно, в наши дни, из Google, и корректирует его до тех пор, пока не произойдет сбой, и позволяет ему выполнять свою работу.

Комментарий (в примере) подразумевает, что поддержка сеанса не является принудительной; они будут созданы только при наличии поддержки сеанса. PHP может быть скомпилирован без поддержки сессии IIRC. В таком случае, либо это ошибка программиста, либо функция всегда будет возвращать false или null, либо что-то еще, если поддержки сеанса не существует.

0 голосов
/ 04 февраля 2013

Я смею ответить, так как я собирался задать тот же вопрос, так как вышеупомянутый фрагмент кода изначально не имел для меня смысла (либо). Поэтому я удивился, почему этот код можно найти повсюду на сайте php.net, и нашел предварительный ответ.

  • До того ... как я думал / надеялся session_id() работает

session_id() возвращает идентификатор сеанса, если сеанс существует. Итак, если я прошел аутентификацию на своем сайте, и сессия была создана и заполнена данными, файл cookie был создан и отправлен в браузер

session_start();
$_SESSION['uid'] = 'root';

на следующей странице, которую я открою в браузере, PHP должен увидеть, что тот самый сеанс, который я открыл на 10 секунд раньше из значения cookie (и внутренних файлов), верно? Таким образом, запустив этот код перед any session_start()

$sid = session_id();
if ($sid) {
   echo "Yes: no need to call session_start since ID is " . $sid;
   exit;
}

будет отображать Да?

  • Нет, это так не работает.

Чтобы проверить, существует ли сессия, нужно позвонить session_start() до session_id(). Но подождите ... если сеанс ранее не существовал (или его срок истек) session_start() создает сеанс . Таким образом, вызов session_id() после session_start() вряд ли вернет пустой результат и не будет иметь большого смысла, если кто-то захочет проверить, существует ли сеанс. Неужели?

  • На самом деле это имеет / может иметь смысл. Зависит от ваших привычек программирования.

Это немного похоже на require и require_once ... У меня нет require_once в моих программах PHP. Потому что требует только тогда, когда это необходимо, и был бы более чем рад получить Фатальную ошибку , сообщающую, что require было сделано дважды: означает ошибку.

То же самое и с сеансами: я вызываю session_start() один раз в начале или вообще не, в зависимости от контекста, поэтому его нельзя вызвать дважды (или фатальная ошибка). Но я предполагаю, что некоторым людям нужно session_id(), чтобы сообщить им, если session_start() уже был вызван ранее в том же запросе . Это где session_id() имеет смысл ...

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