我正在编写一个Web应用程序,将POSTed数据保存到一个页面中的会话,然后重定向到另一个页面以利用创建的会话信息。在我读完之后,处理数据和显示数据的正确方法是将它们分成两个不同的脚本,以免遇到冗余的$ _POST数据问题。也就是说,不要在每次页面刷新时将$ _POSTing保持相同的数据到服务器。
我有一个视图页面index.php
和一个数据处理页面setDate.php
。查看index.php
后,用户可以选择通过输入表单设置$_POST['month']
和$_POST['year']
变量,并将其提交给setDate,分别指定$_SESSION['desMonth']
和$_SESSION['desYear']
。
直到我在session_start();
上添加了第二个(IMO冗余)setDate.php
声明,代码才开始以我想要的方式工作。没有它,就好像index.php
完全无视setDate.php
的{{1}}修改。
如果我已经在使用$_SESSION[*]
数据的初始session_start();
上启动了会话(并收到了PHPSESSID cookie),为什么必须定义此冗余index.php
? / p>
以下是一些有效的代码片段:
$_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
数据将不会被保留。为什么呢?
编辑:问题已回答,编辑虚构的互联网点
答案 0 :(得分:1)
来自php.net:
session_start()创建会话或恢复当前会话 通过GET或POST请求传递的会话标识符,或通过 cookie中。
当调用session_start()或会话自动启动时,PHP会 调用open和read session save handlers。
换句话说,session_start()
不仅在会话尚不存在时创建会话,而且还使脚本可以访问当前会话。它提供对$_SESSION
变量的读取和写入权限。
如果没有session_start
,脚本无法从会话中写入或读取,会话仍然存在但脚本无法读取或修改。如果您只想提供对会话的读访问权限,则可以调用session_write_close();
来关闭写访问权限。当您希望多个文件同时打开同一个会话时,这可能很方便。当脚本具有写访问权限时,它会阻止当前会话文件,阻止所有其他需要对同一会话进行写访问的脚本。
如果你很懒并且总是希望会话处于活动状态,你可以写
php_flag session.auto_start 1
在.htaccess
文件中,以启用php中会话的自动启动。