Я пишу веб-приложение, которое сохраняет 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.