PHP session, почему session_start () требуется несколько раз?

Я пишу веб-приложение, которое сохраняет POSTed данные в сеанс на одной странице, а затем перенаправляет на другую страницу для использования созданной информации сеанса. Это было после того, как я прочитал, что надлежащий способ обработки данных и отображения данных состоит в том, чтобы разделить их на два разных сценария, чтобы не запускать избыточную проблему с данными $ _POST. То есть, чтобы не поддерживать $ _POSTing одни и те же данные на сервере, обновлять каждую страницу.

У меня есть страница просмотра, index.php и страница обработки данных, setDate.php . При просмотре index.php пользователь может выбрать переменные $_POST['month'] и $_POST['year'] через форму ввода и отправить их в setDate для назначения $_SESSION['desMonth'] и $_SESSION['desYear'] соответственно.

Это произошло только после того, как я добавил вторую (избыточность ИМО) session_start(); объявление на setDate.php что код начал работать так, как я хотел. Без него, как если бы index.php игнорировал setDate.php $_SESSION[*] setDate.php .

Почему я должен определить этот избыточный session_start(); если я уже начал сеанс (и получил файл cookie PHPSESSID) на начальном index.php где используются данные $_SESSION[*] ?

Вот некоторые фрагменты рабочего кода:

setDate.php

 <?php require_once 'jan.php'; session_start(); //get the requested month and years to view (iterative). if(isset($_POST['nextMonth']) && filter_var($_POST['nextMonth'], FILTER_SANITIZE_NUMBER_INT)) { //this filter only allows +- and 0-9 $_SESSION['desMonth'] += sanitizeInput($_POST['nextMonth']); if($_SESSION['desMonth'] > 12) { $_SESSION['desMonth'] = $_SESSION['desMonth']-12; $_SESSION['desYear'] += 1; } else if($_SESSION['desMonth'] < 1) { $_SESSION['desMonth'] = 12; $_SESSION['desYear'] -= 1; } } //get the explicit month and years to view. if(isset($_POST['month']) && filter_var($_POST['month'], FILTER_SANITIZE_NUMBER_INT)) { $_SESSION['desMonth'] = sanitizeInput($_POST['month']); echo "set month"; } if(isset($_POST['year']) && filter_var($_POST['year'], FILTER_SANITIZE_NUMBER_INT)) { $_SESSION['desYear'] = sanitizeInput($_POST['year']); echo "set year"; } echo $_SESSION['desMonth']; echo $_SESSION['desYear']; header("Location: /"); die(); ?> 

Усеченный index.php

 <?php session_start(); require_once 'cellUpdater.php'; $timeForDateUse = mktime(1,1,10,$_SESSION['desMonth'],1,$_SESSION['desYear']); //this line is used for various formatting below. ... 

Без session_start(); Объявление в setDate.php $_SESSION[*] не будут сохранены. Зачем?

EDIT: Ответ на вопрос, редактирование для воображаемых интернет-точек

От php.net:

session_start () создает сеанс или возобновляет текущий на основе идентификатора сеанса, переданного через запрос GET или POST, или передается через файл cookie.

Когда вызывается session_start () или когда автозапуск сеанса запускается, PHP будет вызывать открытые и прочитанные обработчики сохранения сеанса.

Другими словами, session_start() не только создает сеанс, когда сеанс еще не существует, но также позволяет сценарию получить доступ к текущему сеансу. Он предоставляет доступ для чтения и записи к переменной $_SESSION .

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

Если вы ленивы и всегда хотите, чтобы сессия была активной, вы можете написать

 php_flag session.auto_start 1 

в файле .htaccess чтобы включить автоматический запуск сеанса в php.