Session变量不能转移到下页.解决: session.use_trans_sid = 1
附:文摘
============================================================
在PHP使用SESSION的朋友可能会碰到这么一个问题。SESSION变量不能跨页传递。这令我苦恼了好些日子,终于通过查资料思考并攻克了这个问题。我觉得。出现这个问题的解决办法有下面几点:
1、client禁用了cookie
2、浏览器出现故障,临时无法存取cookie
3、php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项
为什么会这样呢?以下我解释一下:
Session储存于server端(默认以文件方式存储session),依据client提供的session id来得到用户的文件,取得变量的值,session id能够使用client的Cookie或者Http1.1协议的Query_String(就是訪问的URL的“?
”后面的部分)来传送给server,然后server读取Session的文件夹……。
也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();执行的时候,就在server上产生了一个session文件。随之也产生了与之唯一相应的一个session
id,定义session变量以一定形式存储在刚才产生的session文件里。通过session id,能够取出定义的变量。跨页后,为了使用session,你必须又运行session_start();将又会产生一个session文件。与之相应产生相应的session id。用这个session id是取不出前面提到的第一个session文件里的变量的,由于这个session id不是打开它的“钥匙”。假设在session_start();之前加代码session_id($session id);将不产生新的session文件。直接读取与这个id相应的session文件。
PHP中的session在默认情况下是使用client的Cookie来保存session id的,所以当client的cookie出现故障的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当client的Cookie被禁用或出现故障时,PHP会自己主动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这样的附着也是有一定条件的。即“php.ini中的session.use_trans_sid
= 1或者编译时打开打开了--enable-trans-sid选项”。
用过论坛的朋友都知道,在进入论坛的时候,往往会提示你检查Cookie是否打开,这是由于大多数论坛都是基于Cookie的,论坛用它来保存username、password等用户信息,方便使用。并且非常多朋友都觉得Cookie不安全(事实上不是这样),往往禁用它。事实上在PHP程序中,我们全然能够用SESSION来取代Cookie,它能够不依赖于client是否开启Cookie。
所以。我们能够抛开cookie使用session,即假定用户关闭cookie的情况下使用session,事实上现途径有下面几种:
1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自己主动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。
途径1举例说明:
s1.php
<?
php
session_start();
$_SESSION[’var1’]="中华人民共和国";
$url="<a href=".""s2.php">下一页</a>";
echo $url;
?
>
s2.php
<?php
session_start();
echo "传递的session变量var1的值为:".$_SESSION[’var1’];
?>
执行以上代码,在clientcookie正常的情况下。应该能够在得到结果“中华人民共和国”。
如今你手动关闭client的cookie,再执行,可能得不到结果了吧。
假设得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”
途径2举例说明:
s1.php
<?php
session_start();
$_SESSION[’var1’]="中华人民共和国";
$sn = session_id();
$url="<a href=".""s2.php?
s=".$sn."">下一页</a>";
echo $url;
?
>
s2.php
<?php
session_id($_GET[’s’]);
session_start();
echo "传递的session变量var1的值为:".$_SESSION[’var1’];
?
>
隐藏表单的方法基本原理同上。
途径3举例说明:
login.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
请登录:
<form name="login" method="post" action="mylogin1.php">
username:<input type="text" name="name"><br>
口 令:<input type="password" name="pass"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
mylogin1.php
<?php
$name=$_POST[’name’];
$pass=$_POST[’pass’];
if(!$name || !$pass) {
echo "username或password为空。请<a href="login.html">又一次登录</a>";
die();
}
if (!($name=="youngong" && $pass=="123") {
echo "username或password不对,请<a href="login.html">又一次登录</a>";
die();
}
//注冊用户
ob_start();
session_start();
$_SESSION[’user’]= $name;
$psid=session_id();
$fp=fopen("e:/tmp/phpsid.txt","w+";
fwrite($fp,$psid);
fclose($fp);
//身份验证成功,进行相关操作
echo "已登录<br>";
echo "<a href="mylogin2.php">下一页</a>";
?>
mylogin2.php
<?
php
$fp=fopen("e:/tmp/phpsid.txt","r";
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION[’user’]) && $_SESSION[’user’]="laogong" {
echo "已登录!";
}
else {
//成功登录进行相关操作
echo "未登录,无权訪问";
echo "请<a href="login.html">登录</a>后浏览";
die();
}
?>
相同请关闭cookie測试。username:youngong password:123 这是通过文件保存session id的,文件是:e: mpphpsid.txt,请依据自己的系统决定文件名称或路径。
至于用数据库的方法。我就不举样例了,与文件的方法类似。
总结一下,上面的方法有一个共同点,就是在前一页取得session id。然后想办法传递到下一页。在下一页的session_start();代码之前加代码session_id(传过来的session id);
====================================================================
还有,我的php.ini文件存放在两个地方 1.c:/php4/php.ini 2.c:/winnt/php.ini ,,而我的程序好像仅仅认识 c:/php4/php.ini,对于 winnt 下的php.ini 修改不起作用.!!!
在不清楚哪一个php.ini起作用的时候最好同一时候修改两个文项目,尽管麻烦,但解决这一问题.
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Session变量不能转移到下页.解决: session.use_trans_sid = 1的更多相关文章
- Session变量不能传送到下一页.解决: session.use_trans_sid = 1
转自:http://blog.csdn.net/drylandfish/article/details/244085 附:文摘===================================== ...
- PHP Session 变量
PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...
- Laravel 解决在ajax 请求下不能保存session的问题
Laravel 解决在ajax 请求下不能保存session的问题 \Session::put('isLogin',true); // 你要保存的session key \Session::put(' ...
- ASP.NET MVC下实现前端视图页的Session
在ASP.NET MVC的控制器中可以实现Session处理.如果要在前端视图页实现Session该如何做呢?可以使用window.sessionStorage来做. AlexChittock用jQu ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- 【转】 Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- PHP超级全局变量——Session 变量
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. PHP Session 变量 当您运行一个 ...
- 使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。
使用 StateServer 保存 Session 正常操作情况下Session会无故丢失.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这 ...
- 【架构师之路】集群/分布式环境下5种session处理策略
[架构师之路]集群/分布式环境下5种session处理策略 转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...
随机推荐
- 谁占用了我的Buffer Pool
原文:谁占用了我的Buffer Pool 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/11/buffer-pool.aspx 我在做SQL S ...
- 恢复Ubuntu引导菜单
介绍 当使用双系统,我们经常重Windows! 有没有一种方法:刚刚重装Windows而不重装Ubuntu呢? 在使用Win XP/Ubuntu双系统时.这个问题非常好解决!可是在使用Win7(包括V ...
- teamfoundationserver2010之使用vs2010&&vs2013创建修改签入签出提交代码等操作
好久之前就在个人的电脑上装了vs2013,看到原生支持html5和css3,前端开发还是挺不错的 而公司开发一直用着vs2010,真是羡慕嫉妒恨啊... 于是乎就有了今天的测试 使用工具 teamfo ...
- NSIS:制作软件升级安装包
原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了. 现在,我们就来一步步把这个安装包做 ...
- CentOS7 安装Hadoop集群环境
先按照上一篇安装与配置好CentOS以及zookeeper http://www.cnblogs.com/dopeter/p/4609276.html 本章介绍在CentOS搭建Hadoop集群环境 ...
- GridView网格线都设置
如今,做网上商店的商品陈列,我想用网络格布局,但总认为空好看.所以我想给它一个净加格线.但是,我遇到了一个问题,网络格布局其实很easy,是集GridView布局和背景颜色adapter布局设置背景颜 ...
- Model-View-Presenter(MVP)
Model-View-Presenter(MVP)模式 Model-View-Presenter(MVP)是一种应用程序表示层的设计模式.该设计模式最早于90年代由Taligent提出,并率先在C++ ...
- 数据库文档生成工具——word2chm,SqlSpec
首先使用代码生成器可以生成word版本的数据库文档. 转成chm格式的更加小巧和方便~ SqlSpec是个好工具,可以生成所有数据库相关的信息 之后可以一键生成chm文档.
- java 中间String分类
String a = "aaa"; 用这样的方式的时候java首先在内存中寻找"aaa"字符串.假设有.就把aaa的地址给它 假设没有则创建 String a ...
- 网络资源(4) - extJS视频
2014_08_24 http://v.youku.com/v_show/id_XMjk2ODc0MjA4.html?f=7183617 extJS视频教程04——ExtJS框架入门