php为啥session能在当前页面中输出值,在其他页面从session中取值的时候是NULL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php为啥session能在当前页面中输出值,在其他页面从session中取值的时候是NULL相关的知识,希望对你有一定的参考价值。

你所指的其他页面
1、是否是同一个浏览器。

2、在其他页面刷新的时候登录页面是否关闭。

当你访问登录后再关闭浏览器 sesion 就失效了,
你可以试试登录成功后不要关闭页面再打开新页面。追问

是同一个浏览器

参考技术A session赋值后,其它页面要引入运用追问

能详细的写出代码?

追答

给你个视频看吧

参考技术B 童鞋,使用前要先session_start()追问

我加了这个之后  报错Cannot send session cookie - headers already sent by

追答

session_start()之前不能有输出。有输出就会又这个提示,就算是空格也不行。而且你写的地方也不对。session_start()必须卸载最最最最前面。而不是写在函数里面,而且我明显看到你的session_start()之前有个空格

参考技术C 都是电脑高手

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

【中文标题】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能在当前页面中输出值,在其他页面从session中取值的时候是NULL的主要内容,如果未能解决你的问题,请参考以下文章

php保存session之后从不同页面读取的值不同?

PHP json_encode($arr) 为啥会改变数组的顺序,怎么解决。在线等

PHP使用session控制同一个账户单设备登陆

PHP中SESSION的问题

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

为啥刷新一下页面SessionID会变