PHP会话,为什么session_start()需要多次?

时间:2016-01-27 14:52:27

标签: php mysql session post

我正在编写一个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数据将不会被保留。为什么呢?

编辑:问题已回答,编辑虚构的互联网点

1 个答案:

答案 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中会话的自动启动。