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

Posted

技术标签:

【中文标题】PHP 会话,为啥 session_start() 需要多次?【英文标题】:PHP session, why is session_start() required multiple times?PHP 会话,为什么 session_start() 需要多次? 【发布时间】:2016-05-04 14:14:54 【问题描述】:

我正在编写一个 Web 应用程序,它将 POST 数据保存到一个页面中的会话中,然后重定向到另一个页面以利用创建的会话信息。这是在我读到处理数据和显示数据的正确方法是将它们分成两个不同的脚本之后,以免遇到多余的 $_POST 数据问题。也就是说,不要在每次页面刷新时保持 $_POST 向服务器发送相同的数据。

我有一个查看页面index.php 和一个数据处理页面setDate.php。在查看index.php时,用户可以通过输入表单选择设置$_POST['month']$_POST['year']变量,提交给setDate分别赋值$_SESSION['desMonth']$_SESSION['desYear']

直到我在setDate.php 上添加第二个(IMO 冗余)session_start(); 声明,代码才开始按我想要的方式工作。没有它,就好像index.php 完全忽略了setDate.php$_SESSION[*] 修改。

如果我已经在使用$_SESSION[*] 数据的初始index.php 上启动了会话(并收到了PHPSESSID cookie),为什么还要定义这个多余的session_start();

这里有一些工作代码sn-ps:

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.
...

没有setDate.php 中的session_start(); 声明,$_SESSION[*] 数据将不会被保留。为什么?

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

【问题讨论】:

session_start() 提供在访问会话时调用它的脚本。没有它,脚本就没有会话访问权限 session_start() 需要在任何将访问会话的 PHP 页面开始时调用。存储在$_SESSION 数组中的数据只有在会话启动后才可用 站点中的每个脚本 中调用 session_start() 也是一个好主意,因为它可以阻止会话超时,如果您只是实际使用几个脚本中的会话 简短回答:会话属于选择加入类型,因此您不必在不需要它们时明确禁用它们。 【参考方案1】:

来自 php.net:

session_start() 创建会话或恢复当前会话 通过 GET 或 POST 请求传递的会话标识符,或通过 饼干。

当 session_start() 被调用或会话自动启动时,PHP 将 调用打开和读取会话保存处理程序。

换句话说,session_start() 不仅在会话尚不存在时创建会话,而且还使脚本可以访问当前会话。它提供对$_SESSION 变量的读取 写入访问权限。

没有session_start,脚本无法写入或读取会话,会话仍然存在,但脚本无法读取或修改它。如果您只想授予对会话的读取权限,您可以调用session_write_close(); 来关闭写入权限。当您希望多个文件同时打开同一个会话时,这会很方便。当脚本具有写访问权限时,它会阻止当前会话文件,从而阻止所有其他想要对同一会话进行写访问的脚本。

如果你很懒,总是希望会话处于活动状态,你可以写

php_flag session.auto_start 1

.htaccess 文件中启用 php 中会话的自动启动。

【讨论】:

很好的答案。我看到了 session_start() 文档,但我忽略了“恢复当前的..”部分。谢谢!

以上是关于PHP 会话,为啥 session_start() 需要多次?的主要内容,如果未能解决你的问题,请参考以下文章

即使我有 session_start(); 我的会话变量也不会传递到我的其他页面;在所有 3 页的开头。为啥是这样?

PHP会话控制之session_start

PHP:会话变量

php。 session_start() [function.session-start]:无法发送会话 cookie 错误

如何从本地的 PHP session_start() 检查不同的变量? [复制]

session_start() 每次刷新都会创建新会话 [重复]