2017-07-02 25 views
0

我无法解决Codeigniter存在的问题。当我成功登录并创建必要的会话变​​量时,下一个请求中的重定向无法检索这些变量。 $ _SESSION var没有它们!会话数据不会传播到下一个请求

这只是执行的代码,当有人提交用户名和密码登录:

$data = array(
    'user'  => $this->input->post('user'), 
    'password' => $this->input->post('password'), 
); 

// Trying to log in 
try{ 
    // Validation .... 

    // Users instance creation .... 
    $this->user = (...) 

    // Last action before the redirection 
    $this->session->set_userdata(array(
       'user'   => serialize($this->user), 
       'logged_in'  => true, 
       'last_access'  => time(), 
       'session_max_time' => config_item('app_sess_expiration'), 
     )); 

    // At this point, if I do a var_dump($_SESSION), it will display all my session variables as expected. 

    redirect(base_url()); 
} 
catch (Exception $e) { 
    // Not reaching this code 
    $data['error'] = $e->getMessage(); 
    redirect_to_login(); 
} 

现在,如果我的var_dump($ _ SESSION)系统在session_start()之后/库/会话/ session.php文件它只会显示,在重定向请求:

Array 
(
    [__ci_last_regenerate] => 1499021453 
) 

我自己的会话变量丢失!

我检查了,每次我尝试验证,创建一个新的会话变量:

[email protected] ~ $ ls -la /opt/lampp/temp 
total 20312 
drwxrwxrwx 2 daemon daemon 24576 jul 2 21:16 . 
drwxr-xr-x 30 root root  4096 jun 19 22:37 .. 
-rw------- 1 daemon daemon 20735126 jun 20 22:14 phpjtS2zn 
-rw------- 1 daemon daemon  34 jul 2 20:50 session_myapp51697449f5b8d526ee2cce05a5149135e3c1d74f 
-rw------- 1 daemon daemon  785 jul 2 21:16 session_myapp72d8e8c189283c1d5c5d4ed60d7dd58ed5d9d69c 
-rw------- 1 daemon daemon  34 jul 2 21:16 session_myapp9a97c65cda1c846028fc3035abe5023a73cf974b 
-rw------- 1 daemon daemon  34 jul 2 21:16 session_myappf122822e7c8887b14239eb9e97d70266d47c658b 
-rw------- 1 daemon daemon 14891 jul 2 21:15 sess_50fbaf84f2b49bf7c176b8c0396c099e 

我不知道,如果该文件的权限可能有事情做。我为temp目录中的所有用户授予了读取权限,但所有会话文件都是使用所有者权限创建的。不过,我认为守护进程也是运行过程的所有者,不是吗?所以应该检索会话文件。

编辑1:

这是我的会议config.php文件

$config['sess_driver'] = 'files'; 
$config['sess_cookie_name'] = 'session_myapp'; 
$config['sess_expiration'] = 0; 
$config['sess_save_path'] = "/opt/lampp/temp"; 
$config['sess_match_ip'] = FALSE; 
$config['sess_time_to_update'] = 30; 
$config['sess_regenerate_destroy'] = FALSE; 
+0

你有没有关于使用codeigniter表单验证https://www.codeigniter.com/user_guide/libraries/form_validation.html – user4419336

+0

CI会话是独立于PHP会话。它们存储在您定义的文件或数据库表中。那么你的config.php文件中的CI Sessions配置设置是什么? – TimBrownlaw

+0

@TimBrownlaw我使用文件存储选项。我已经按照您的要求添加了会话配置行。 –

回答

0
if($_POST['user'] && $_POST['password']) 

{ 

$this->session->set_userdata(array(

'user'   => serialize($this->user), 
'logged_in'  => true, 
'last_access'  => time(), 
'session_max_time' => config_item('app_sess_expiration'), 
)); 
} 
+0

当我设置会话数据 –

+0

设置会话只有当POST值从前一页传递时,我有$ _POST ['用户']和$ _POST ['密码']。否则会话值将被保存为空。所以我建议尝试上面的代码..... – Edwin

+0

正如我告诉你,当我设置会话变量时,POST已经填充。我做了一个验证来检查它,在这种情况下抛出并捕获异常。我省略了验证,因为它不相关(只有一条评论提到它)。 –

0

你必须把查询之前创建会话..这样的设置;

if($query->num_array() > 0){ 


//create your own session data .. 

} 

也确保你把这个在配置/自动加载

$autoload['libraries'] = array('database', 'session'); 

,并尝试使用其他浏览器,或清除浏览器的cookie,然后再试一次。

+0

我已经将会话库添加到自动加载器,并且正在使用会话的文件存储配置,而不是数据库。 –