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 在搭建完集群环境后,不得不考虑的一个问题就是 ...
随机推荐
- 实例教程Unity3D单例模式(一)通经常使使用方法
unity3d教程 中的单例模式通经常使使用方法 通经常使使用方法是在相关类增加GetInstance()的静态方法,检查实例是否存在.假设存在,则返回.假设不存在.则返回一个"须要用游戏元 ...
- SQL开发中容易忽视的一些小地方(四)
原文:SQL开发中容易忽视的一些小地方(四) 本篇我想针对网上一些对于非聚集索引使用场合的某些说法进行一些更正. 下面引用下MSDN对于非聚集索引结构的描述. 非聚集索引结构: 1:非聚集索引与聚集索 ...
- Docker安装应用程序(Centos6.5_x64)
Docker安装应用程序(Centos6.5_x64) Authoer::jom_ch@2014/7/23 Docker官方网站 http://www.docker.com/ 一,安装EPEL 关于E ...
- opengl
扳回一球
本文介绍了使用两种方法opengl画一个球体,一个是一个球形点位置计算,然后绘制出,还有一个glut套件自带功能. 一.直接绘制法 直接贴代码,解释都写在凝视里了.绘制时先移动好坐标系.然后调用这方法 ...
- 写你自己 android 多通道打包工具 可以包libs和.so文件
android上传应用程序,需要区分各个信道. 通常更改配置文件中的一个通道id,假设有多个通道,手动更改并生成apk这将是非常麻烦的,及增加误差的概率. 在这个课堂上分享一个打包工具.也可在网上类似 ...
- 如何用Excel直接查询Oracle中的数据(转)
将Oracle中查询的数据保存为Excel文件,通常使用的是PL/SQL Developer. 其实,Excel可直接写SQL语句查询Oracle中数据,在这里,用到ODBC驱动.详细步骤如下: 一. ...
- Lichee (六) 优化配置的微内核
我们的分析<Lichee(二) 在sun4i_crane平台下的编译 >的时候.竟然没有一个步骤是在配置内核 make ARCH=arm menuconfig 细致的读过的代码的会发现,在 ...
- 采用Duplicate target database在线恢复秩序oracle datagard图书馆设备
线上oracle datagard备库由于断电以及误删除从库的归档日志文件,所以导致,备库主库数据不一致,备库须要紧急恢复.以下是大概恢复过程 1,从主库上面备份控制文件[oracle@localho ...
- 经典算法题每日演练——第十一题 Bitmap算法
原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...
- 远程数据client交换器
不太繁忙的文本. 要被写入