用户
 找回密码
 入住 CI 中国社区
搜索
查看: 13649|回复: 10
收起左侧

[已解决] CI使用PHP原生session的问题

[复制链接]
发表于 2011-1-31 10:43:34 | 显示全部楼层 |阅读模式
可能 这个问题和 CI没有什么关系 。。不过不知道可以放到哪里。。就来这里问了

自从上次使用CI的session出 问题 之后 。就开始尝试使用PHP的 原生session。但是还是出现问题 ,由于是菜鸟。不知道怎么解决了。上来问问大家

情况是这样的

我有一个模板文件,叫base_page.php,其他所有页面都是基于这个模板的,这个模板文件这样写的


  1. <?php session_start();echo session_id();?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4.     <head>
  5.         <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.         <title>Blog</title>
  7.         <meta name="keywords" content="" />
  8.         <meta name="description" content="" />
  9.         <link href="<?php echo base_url(); ?>css/main.css" rel="stylesheet" type="text/css" media="screen" />
  10.         <script type="text/javascript" src="<?php echo base_url(); ?>js/articles_list.js"></script>
  11.     </head>
  12.     <body>
  13.         <div id="wrapper">
  14.             <div id="header-wrapper">
  15.                 <?php include('header.php'); ?>
  16.             </div>
  17.             <!-- end #header-wrapper -->
  18.             <div id="page">
  19.                 <div id="banner"><a href="#"><img src="<?php echo base_url(); ?>/images/img05.jpg" alt="" /></a></div>
  20.                 <div id="page-bgcontent">
  21.                     <?php if ($page_type == 'articles_list'):?>
  22.                         <?php include('articles_list.php'); ?>
  23.                     <?php endif;?>
  24.                     <?php if ($page_type == 'login'):?>
  25.                         <?php include('login.php'); ?>
  26.                     <?php endif;?>
  27.                     <?php include('sidebar.php'); ?>
  28.                     <div style="clear: both;">&nbsp;</div>
  29.                 </div>
  30.                 <?php include('footer.php'); ?>
  31.             </div>
  32.             <!-- end #page -->
  33.         </div>
  34.     </body>
  35. </html>

复制代码
这个文件最开始有session_start(),,然后我想获得这个session的 ID

在这个模板文件的<?php include('header.php'); ?>
这个 header文件里面,有一个login功能

代码是这样的

  1. <div id="header">
  2.     <div id="logo">
  3.         <h1><a href="#">BLOG</a></h1>
  4.         <h2>Brand New</h2>
  5.     </div>
  6.     <div id="search">
  7.         <form method="get" action="">
  8.             <fieldset>
  9.                 <input type="text" id="search-text" name="s" value="" />
  10.             </fieldset>
  11.         </form>
  12.     </div>
  13.     <!-- end #logo -->
  14. </div>
  15. <!-- end #header -->
  16. <div id="menu">
  17.     <ul>
  18.         <li class="first"><a href="#">Home</a></li>
  19.         <li><a href="#">About</a></li>
  20.         <li><a href="#">Contact</a></li>
  21.     </ul>
  22.     <?php if (!isset($_SESSION['username'])): ?>
  23.         <a href="<?php echo base_url(); ?>index.php/login/" id="login">Login</a>
  24.     <?php elseif (isset($_SESSION['username'])): ?>
  25.             <a href="<?php echo base_url(); ?>index.php/logout/" id="logout">Logout</a>
  26.     <?php endif; ?>
  27. </div>
  28. <!-- end #menu -->
复制代码
然后login的controller是这样写的

  1. class Login extends Controller
  2. {

  3.     function Login()
  4.     {
  5.         parent::Controller();
  6.     }

  7.     function index()
  8.     {

  9.         if ((isset($_POST['username'])) && (isset($_POST['password'])))
  10.         {
  11.             $username = trim($_POST['username']);
  12.             $password = trim($_POST['password']);

  13.             $data['error'] = "";

  14.             // Check whether the usename or the password is empty
  15.             if (empty($username))
  16.             {
  17.                 $data['error'] = "Username cannot be NULL!";
  18.             }
  19.             elseif (empty($password))
  20.             {
  21.                 $data['error'] = "Password cannot be NULL!";
  22.             }

  23.             if ((!empty($username)) && (!empty($password)))
  24.             {
  25.                 $sql = "SELECT `u_id`, `u_password` FROM `user` WHERE `u_username` = '" . $username . "'";
  26.                 $this->load->model('blog_model');
  27.                 $result = $this->blog_model->query($sql);
  28.                
  29.                 // If username does not exist
  30.                 if (empty($result))
  31.                 {
  32.                     $data['error'] = "User does not exist!";
  33.                 }
  34.                 // If password does not match
  35.                 elseif ($password != $result[0]->u_password)
  36.                 {
  37.                     $data['error'] = "Password error!";
  38.                 }
  39.                 elseif ($password == $result[0]->u_password)
  40.                 {
  41.                     session_start();
  42.                     $_SESSION['user_id'] = $result[0]->u_id;
  43.                     $_SESSION['username'] = $username;
  44.                     redirect(base_url() . "index.php");
  45.                 }
  46.             }
  47.         }
  48.         $data['page_type'] = 'login';
  49.         $this->load->view('basic_page', $data);
  50.     }

  51. }
复制代码
这个时候,如果我首先打开首页,由于 session_start()的作用,会创建一个session文件 。。这个时候,如果我点击login这个超级连接。。我发现 。。又一个新的session文件又被创建了 。而且以后的login的过程中,操作的都是新创建的session,第一个完全没有内容

等我登陆之后 ,,如果新开一个页面,,再进入首页,,会操作第一个session,这样由于没有内容,用户处于没有登陆状态,如果我点击login,会发现,第2个有内容的session被调用,这样用户就处于登陆状态了。。。。。我感到很奇怪。。不知道为什么会这样。。


不知道这样有没有说清楚。。如果需要其他什么问题活着补充的话。我请告诉我 。。谢谢 。。我在线等的
发表于 2014-6-13 09:49:59 | 显示全部楼层
Hex 发表于 2014-6-12 20:08
这个是直接替换的 Session 类,肯定是支持,但是和文档描述的接口可能有不同。

...

恩,试过了,是支持的.对于过期时间怎么设置呢,只能通过 ini_set 来全局设置 session.gc_maxlifetime么,单一session的过期时间可以进行设置么?

发表于 2014-6-13 10:12:40 | 显示全部楼层
西斯莱杰 发表于 2014-6-13 09:49
恩,试过了,是支持的.对于过期时间怎么设置呢,只能通过 ini_set 来全局设置 session.gc_maxlifetime么 ...

Session 都是统一过期吧,Session 不是缓存,要搞清楚用途。

发表于 2014-6-12 20:08:05 | 显示全部楼层
西斯莱杰 发表于 2014-6-12 19:06
2.1.4 版本,支持么?

这个是直接替换的 Session 类,肯定是支持,但是和文档描述的接口可能有不同。

发表于 2011-1-31 11:46:21 | 显示全部楼层
用我发布的 Session 类即可解决问题,不用这么纠结。
 楼主| 发表于 2011-1-31 11:47:39 | 显示全部楼层
哦 。。。我去看看 ,谢谢啊 ,只是我不知道为什么会这样 。。。感觉没有什么问题
 楼主| 发表于 2011-1-31 12:35:31 | 显示全部楼层
我知道了。。我刚开始打的时候用的URL是 127.0.01/myblog,然后跳转之后的url变成了localhost以至于可能误认为2个不同的地址或者什么的,,如果一开始就打localhost/myblog的话。。就不会出现问题了 。。哈哈 。。谢谢哑
发表于 2012-12-12 22:30:28 | 显示全部楼层
Hex 发表于 2011-1-31 11:46
用我发布的 Session 类即可解决问题,不用这么纠结。

你好,我新手一个,看到好多地方都是用你的session类,但是没找到地方下载啊,提供个连接把。谢谢啊
发表于 2012-12-13 10:42:05 | 显示全部楼层
白色格调 发表于 2012-12-12 22:30
你好,我新手一个,看到好多地方都是用你的session类,但是没找到地方下载啊,提供个连接把。谢谢啊 ...

http://codeigniter.org.cn/forums/thread-4007-1-1.html

常去代码区看看啊~
发表于 2014-6-12 19:06:53 | 显示全部楼层
Hex 发表于 2012-12-13 10:42
http://codeigniter.org.cn/forums/thread-4007-1-1.html

常去代码区看看啊~

2.1.4 版本,支持么?

本版积分规则