设为首页 收藏本站
查看: 581|回复: 0

[经验分享] php 跨页session丢失问题

[复制链接]

尚未签到

发表于 2017-3-29 13:37:32 | 显示全部楼层 |阅读模式
     抛开cookie使用session
  PHP中SESSION不能跨页传递问题的解决办法
  在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递。这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题。我认为,出现这个问题的原因有以下几点:
  1、客户端禁用了cookie
  2、浏览器出现问题,暂时无法存取cookie
  3、php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项
  为什么会这样呢?下面我解释一下:
  Session储存于服务器端(默认以文件方式存储session),根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个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在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,即“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”。
  明白了以上的道理,现在我们来抛开cookie使用session,主要途径有三条:
  1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。
  2、手动通过URL传值、隐藏表单传递session id。
  3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。
  通过例子来说明吧:
  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'];
  ?>
  运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
  现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”
  这也就是上面所说的途径1。
  下面再说途径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=??????">
  </head>
  <body>
  请登录:
  <form name="login" method="post" action="mylogin1.php">
  用户名:<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 "用户名或密码为空,请<a href=\"login.html\">重新登录</a>";
  die();
  }
  if (!($name=="laogong" && $pass=="123")) {
  echo "用户名或密码不正确,请<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测试,用户名:laogong 密码:123 这是通过文件保存session id的,文件是:e:\tmp\phpsid.txt,请根据自己的系统决定文件名或路径。
  至于用数据库的方法,我就不举例子了,与文件的方法类似。
  总结一下,上面的方法有一个共同点,就是在前一页取得session id,然后想办法传到下一页,在下一页的session_start();代码之前加代码session_id(传过来的session id);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357159-1-1.html 上篇帖子: PHP PDF 转 JPG 图片 Make PDF to JPEG Converter in PHP 下篇帖子: PHP学习(4)phpMyAdmin安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表