附:文摘

============================================================

在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的更多相关文章

  1. Session变量不能传送到下一页.解决: session.use_trans_sid = 1

    转自:http://blog.csdn.net/drylandfish/article/details/244085 附:文摘===================================== ...

  2. PHP Session 变量

    PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...

  3. Laravel 解决在ajax 请求下不能保存session的问题

    Laravel 解决在ajax 请求下不能保存session的问题 \Session::put('isLogin',true); // 你要保存的session key \Session::put(' ...

  4. ASP.NET MVC下实现前端视图页的Session

    在ASP.NET MVC的控制器中可以实现Session处理.如果要在前端视图页实现Session该如何做呢?可以使用window.sessionStorage来做. AlexChittock用jQu ...

  5. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  6. 【转】 Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  7. PHP超级全局变量——Session 变量

    PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. PHP Session 变量 当您运行一个 ...

  8. 使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。

    使用 StateServer 保存 Session 正常操作情况下Session会无故丢失.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这 ...

  9. 【架构师之路】集群/分布式环境下5种session处理策略

    [架构师之路]集群/分布式环境下5种session处理策略   转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...

随机推荐

  1. RandomAccessFile实时读取大文件(转)

    最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据是新增 ...

  2. C#+Mapxtreme 实现一些GIS系统基本的功能

    此程序包括了mapxtreme地图相关基本功能的演示其中包括 鹰眼地图,图层控制,发达,缩小,平移地图,地图模糊查询,中点工具,距离测量工具,面积测量工具,图元信息查看工具.适合于企业级开发,可以为您 ...

  3. 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)

    pinyin4j项目  官网地址 http://pinyin4j.sourceforge.net/ 我们先把资源下载下来,连同源码和jar包一起放入工程.如下图: 接下来在demo包下,我们写一个测试 ...

  4. NSIS:使用FileFunc.nsh头文件判断文件版本

    原文 NSIS:使用FileFunc.nsh头文件判断文件版本 这里,轻狂拿WMP10做一个例子.关于WMP10的原始安装文件,可以下载后通过/C /T:D:\Windows Media Player ...

  5. JMeter怎么使用代理服务器

    一.JMeter有一个内置的代理服务器,主要用户使用浏览器录制脚本,在左侧的WorkBench中添加HTTP Proxy Server即可, 其中port表示代理服务器段口号, URL Pattern ...

  6. OBIEE SampleAppv406 自己主动启动配置

    SampleApp 一个简短的引论: SampleApp这是一个一站式服务,几乎证明OBIEE不管顶的特征可想而知. 它安装了大量的应用(数据库,OBIEE,的Endeca.TimesTen的.Ess ...

  7. DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

    原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助 ...

  8. gcd&&lcm

    1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入2个正整数A,B,求A与B的最大公约数.   Input 2个数A,B,中 ...

  9. Tips & Tricks:Apache log4j简明教程(二)

    在上一讲Apache log4j简明教程(一)中介绍了log4j的基本概念,配置文件,以及将日志写入文件的方法,并给出了一个详细的示例.这一讲,我在继续谈一谈如何使用log4j将日志写入MySQL数据 ...

  10. 如何使用Ubuntu打电话

    在这个视频,我们学习如何使用Ubuntu打电话.Ubuntu手机的很多用户谁是不是很熟悉. 特别是,他什么都无所谓的物理按键(菜单键.home纽带.回车键).然后用户如何控制手机它?Ubuntu手机凭 ...