2014-01-29 276 views
1

我想在CodeIgniter中建立一个登录系统。到目前为止,所有的工作都是有效的,直到我必须将细节保存到SESSION中。我尝试了多种方法,但我多么努力,当我转储它时,SESSION数组是空的。PHP(CodeIgniter)会话空

public function submit() 
{ 
$this->load->helper(array('form')); 
// authenticate 
$username = $this->input->post('txtLogin'); 
$password = $this->input->post('txtPassword'); 

//query the database 
$result = $this->user->login($username, $password); 

if($result) 
{ 

session_start(); 
$sess_array = array(); 
foreach($result as $row) 
{ 
    $sess_array = array(
    'id' => $row->GebruikerID, 
    'username' => $row->Email 
    ); 
    $this->session->set_userdata('logged_in', $sess_array); 

    redirect('dashboard'); 
} 

这是我检查证书的部分,如果成功,我设置会话。 注意:我也尝试将session_start();置于页面顶部,甚至在代码中没有使用session_start();进行尝试。

if($this->session->userdata('logged_in')) 
{ 
    print_r($_SESSION); 
    exit(); 
} 

这是我检查会话是否在另一个控制器中设置的部分。

print_r($_SESSION)结果:

Array(); 

我不知道我要去哪里错了。

编辑:

这是我的配置文件:

 <?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

     /* 
     |-------------------------------------------------------------------------- 
     | Base Site URL 
     |-------------------------------------------------------------------------- 
     | 
     | URL to your CodeIgniter root. Typically this will be your base URL, 
     | WITH a trailing slash: 
     | 
     | http://example.com/ 
     | 
     | If this is not set then CodeIgniter will guess the protocol, domain and 
     | path to your installation. 
     | 
     */ 
     $config['base_url'] = ''; 

     /* 
     |-------------------------------------------------------------------------- 
     | Index File 
     |-------------------------------------------------------------------------- 
     | 
     | Typically this will be your index.php file, unless you've renamed it to 
     | something else. If you are using mod_rewrite to remove the page set this 
     | variable so that it is blank. 
     | 
     */ 
     $config['index_page'] = 'index.php'; 

     /* 
     |-------------------------------------------------------------------------- 
     | URI PROTOCOL 
     |-------------------------------------------------------------------------- 
     | 
     | This item determines which server global should be used to retrieve the 
     | URI string. The default setting of 'AUTO' works for most servers. 
     | If your links do not seem to work, try one of the other delicious flavors: 
     | 
     | 'AUTO'   Default - auto detects 
     | 'PATH_INFO'  Uses the PATH_INFO 
     | 'QUERY_STRING' Uses the QUERY_STRING 
     | 'REQUEST_URI'  Uses the REQUEST_URI 
     | 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO 
     | 
     */ 
     $config['uri_protocol'] = 'AUTO'; 

     /* 
     |-------------------------------------------------------------------------- 
     | URL suffix 
     |-------------------------------------------------------------------------- 
     | 
     | This option allows you to add a suffix to all URLs generated by CodeIgniter. 
     | For more information please see the user guide: 
     | 
     | http://codeigniter.com/user_guide/general/urls.html 
     */ 

     $config['url_suffix'] = ''; 

     /* 
     |-------------------------------------------------------------------------- 
     | Default Language 
     |-------------------------------------------------------------------------- 
     | 
     | This determines which set of language files should be used. Make sure 
     | there is an available translation if you intend to use something other 
     | than english. 
     | 
     */ 
     $config['language'] = 'english'; 

     /* 
     |-------------------------------------------------------------------------- 
     | Default Character Set 
     |-------------------------------------------------------------------------- 
     | 
     | This determines which character set is used by default in various methods 
     | that require a character set to be provided. 
     | 
     */ 
     $config['charset'] = 'UTF-8'; 

     /* 
     |-------------------------------------------------------------------------- 
     | Enable/Disable System Hooks 
     |-------------------------------------------------------------------------- 
     | 
     | If you would like to use the 'hooks' feature you must enable it by 
     | setting this variable to TRUE (boolean). See the user guide for details. 
     | 
     */ 
     $config['enable_hooks'] = FALSE; 


     /* 
     |-------------------------------------------------------------------------- 
     | Class Extension Prefix 
     |-------------------------------------------------------------------------- 
     | 
     | This item allows you to set the filename/classname prefix when extending 
     | native libraries. For more information please see the user guide: 
     | 
     | http://codeigniter.com/user_guide/general/core_classes.html 
     | http://codeigniter.com/user_guide/general/creating_libraries.html 
     | 
     */ 
     $config['subclass_prefix'] = 'MY_'; 


     /* 
     |-------------------------------------------------------------------------- 
     | Allowed URL Characters 
     |-------------------------------------------------------------------------- 
     | 
     | This lets you specify with a regular expression which characters are permitted 
     | within your URLs. When someone tries to submit a URL with disallowed 
     | characters they will get a warning message. 
     | 
     | As a security measure you are STRONGLY encouraged to restrict URLs to 
     | as few characters as possible. By default only these are allowed: a-z 0-9~%.:_- 
     | 
     | Leave blank to allow all characters -- but only if you are insane. 
     | 
     | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! 
     | 
     */ 
     $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; 


     /* 
     |-------------------------------------------------------------------------- 
     | Enable Query Strings 
     |-------------------------------------------------------------------------- 
     | 
     | By default CodeIgniter uses search-engine friendly segment based URLs: 
     | example.com/who/what/where/ 
     | 
     | By default CodeIgniter enables access to the $_GET array. If for some 
     | reason you would like to disable it, set 'allow_get_array' to FALSE. 
     | 
     | You can optionally enable standard query string based URLs: 
     | example.com?who=me&what=something&where=here 
     | 
     | Options are: TRUE or FALSE (boolean) 
     | 
     | The other items let you set the query string 'words' that will 
     | invoke your controllers and its functions: 
     | example.com/index.php?c=controller&m=function 
     | 
     | Please note that some of the helpers won't work as expected when 
     | this feature is enabled, since CodeIgniter is designed primarily to 
     | use segment based URLs. 
     | 
     */ 
     $config['allow_get_array']  = TRUE; 
     $config['enable_query_strings'] = FALSE; 
     $config['controller_trigger'] = 'c'; 
     $config['function_trigger']  = 'm'; 
     $config['directory_trigger'] = 'd'; // experimental not currently in use 

     /* 
     |-------------------------------------------------------------------------- 
     | Error Logging Threshold 
     |-------------------------------------------------------------------------- 
     | 
     | If you have enabled error logging, you can set an error threshold to 
     | determine what gets logged. Threshold options are: 
     | You can enable error logging by setting a threshold over zero. The 
     | threshold determines what gets logged. Threshold options are: 
     | 
     | 0 = Disables logging, Error logging TURNED OFF 
     | 1 = Error Messages (including PHP errors) 
     | 2 = Debug Messages 
     | 3 = Informational Messages 
     | 4 = All Messages 
     | 
     | For a live site you'll usually only enable Errors (1) to be logged otherwise 
     | your log files will fill up very fast. 
     | 
     */ 
     $config['log_threshold'] = 0; 

     /* 
     |-------------------------------------------------------------------------- 
     | Error Logging Directory Path 
     |-------------------------------------------------------------------------- 
     | 
     | Leave this BLANK unless you would like to set something other than the default 
     | application/logs/ folder. Use a full server path with trailing slash. 
     | 
     */ 
     $config['log_path'] = ''; 

     /* 
     |-------------------------------------------------------------------------- 
     | Date Format for Logs 
     |-------------------------------------------------------------------------- 
     | 
     | Each item that is logged has an associated date. You can use PHP date 
     | codes to set your own date formatting 
     | 
     */ 
     $config['log_date_format'] = 'Y-m-d H:i:s'; 

     /* 
     |-------------------------------------------------------------------------- 
     | Cache Directory Path 
     |-------------------------------------------------------------------------- 
     | 
     | Leave this BLANK unless you would like to set something other than the default 
     | system/cache/ folder. Use a full server path with trailing slash. 
     | 
     */ 
     $config['cache_path'] = ''; 

     /* 
     |-------------------------------------------------------------------------- 
     | Encryption Key 
     |-------------------------------------------------------------------------- 
     | 
     | If you use the Encryption class or the Session class you 
     | MUST set an encryption key. See the user guide for info. 
     | 
     */ 
     $config['encryption_key'] = 'You're not allowed to see this'; 

     /* 
     |-------------------------------------------------------------------------- 
     | Session Variables 
     |-------------------------------------------------------------------------- 
     | 
     | 'sess_cookie_name'  = the name you want for the cookie 
     | 'sess_expiration'   = the number of SECONDS you want the session to last. 
     | by default sessions last 7200 seconds (two hours). Set to zero for no expiration. 
     | 'sess_expire_on_close' = Whether to cause the session to expire automatically 
     | when the browser window is closed 
     | 'sess_encrypt_cookie'  = Whether to encrypt the cookie 
     | 'sess_use_database'  = Whether to save the session data to a database 
     | 'sess_table_name'   = The name of the session database table 
     | 'sess_match_ip'   = Whether to match the user's IP address when reading the session data 
     | 'sess_match_useragent' = Whether to match the User Agent when reading the session data 
     | 'sess_time_to_update'  = how many seconds between CI refreshing Session Information 
     | 
     */ 
     $config['sess_cookie_name']  = 'ci_session'; 
     $config['sess_expiration']  = 7200; 
     $config['sess_expire_on_close'] = FALSE; 
     $config['sess_encrypt_cookie'] = FALSE; 
     $config['sess_use_database'] = FALSE; 
     $config['sess_table_name']  = 'ci_sessions'; 
     $config['sess_match_ip']  = FALSE; 
     $config['sess_match_useragent'] = TRUE; 
     $config['sess_time_to_update'] = 300; 

     /* 
     |-------------------------------------------------------------------------- 
     | Cookie Related Variables 
     |-------------------------------------------------------------------------- 
     | 
     | 'cookie_prefix' = Set a prefix if you need to avoid collisions 
     | 'cookie_domain' = Set to .your-domain.com for site-wide cookies 
     | 'cookie_path' = Typically will be a forward slash 
     | 'cookie_secure' = Cookies will only be set if a secure HTTPS connection exists. 
     | 
     */ 
     $config['cookie_prefix'] = ""; 
     $config['cookie_domain'] = ""; 
     $config['cookie_path']  = "/"; 
     $config['cookie_secure'] = FALSE; 

     /* 
     |-------------------------------------------------------------------------- 
     | Global XSS Filtering 
     |-------------------------------------------------------------------------- 
     | 
     | Determines whether the XSS filter is always active when GET, POST or 
     | COOKIE data is encountered 
     | 
     */ 
     $config['global_xss_filtering'] = FALSE; 

     /* 
     |-------------------------------------------------------------------------- 
     | Cross Site Request Forgery 
     |-------------------------------------------------------------------------- 
     | Enables a CSRF cookie token to be set. When set to TRUE, token will be 
     | checked on a submitted form. If you are accepting user data, it is strongly 
     | recommended CSRF protection be enabled. 
     | 
     | 'csrf_token_name' = The token name 
     | 'csrf_cookie_name' = The cookie name 
     | 'csrf_expire' = The number in seconds the token should expire. 
     */ 
     $config['csrf_protection'] = FALSE; 
     $config['csrf_token_name'] = 'csrf_test_name'; 
     $config['csrf_cookie_name'] = 'csrf_cookie_name'; 
     $config['csrf_expire'] = 7200; 

     /* 
     |-------------------------------------------------------------------------- 
     | Output Compression 
     |-------------------------------------------------------------------------- 
     | 
     | Enables Gzip output compression for faster page loads. When enabled, 
     | the output class will test whether your server supports Gzip. 
     | Even if it does, however, not all browsers support compression 
     | so enable only if you are reasonably sure your visitors can handle it. 
     | 
     | VERY IMPORTANT: If you are getting a blank page when compression is enabled it 
     | means you are prematurely outputting something to your browser. It could 
     | even be a line of whitespace at the end of one of your scripts. For 
     | compression to work, nothing can be sent before the output buffer is called 
     | by the output class. Do not 'echo' any values with compression enabled. 
     | 
     */ 
     $config['compress_output'] = FALSE; 

     /* 
     |-------------------------------------------------------------------------- 
     | Master Time Reference 
     |-------------------------------------------------------------------------- 
     | 
     | Options are 'local' or 'gmt'. This pref tells the system whether to use 
     | your server's local time as the master 'now' reference, or convert it to 
     | GMT. See the 'date helper' page of the user guide for information 
     | regarding date handling. 
     | 
     */ 
     $config['time_reference'] = 'local'; 


     /* 
     |-------------------------------------------------------------------------- 
     | Rewrite PHP Short Tags 
     |-------------------------------------------------------------------------- 
     | 
     | If your PHP installation does not have short tag support enabled CI 
     | can rewrite the tags on-the-fly, enabling you to utilize that syntax 
     | in your view files. Options are TRUE or FALSE (boolean) 
     | 
     */ 
     $config['rewrite_short_tags'] = FALSE; 


     /* 
     |-------------------------------------------------------------------------- 
     | Reverse Proxy IPs 
     |-------------------------------------------------------------------------- 
     | 
     | If your server is behind a reverse proxy, you must whitelist the proxy IP 
     | addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR 
     | header in order to properly identify the visitor's IP address. 
     | Comma-delimited, e.g. '10.0.1.200,10.0.1.201' 
     | 
     */ 
     $config['proxy_ips'] = ''; 


     /* End of file config.php */ 
     /* Location: ./application/config/config.php */ 

编辑: 解决了!感谢WebHQ。

这奏效了:

我看到两个问题。首先,你设置会话数据错误([手动]>>(http://ellislab.com/codeigniter/user-guide/libraries/sessions.html)):

更改此:

$这个 - >会话级> set_userdata( 'LOGGED_IN',$ sess_array);

进入这个:

$这个 - >会话级> set_userdata($ sess_array);

然后阅读这样的会话数据:

$这个 - >会话级>用户数据( '身份证'); $ this-> session-> userdata('username');

祝你好运!

+0

请附上您的'config.php'文件内容。 –

+0

已添加。谢谢.. – user3249696

+0

您是否首先加载会话库?通过'$ this-> load-> library('session');'?或者在'autoload.php'中加入? –

回答

2

我看到两个问题。首先,你设置会话数据错误(manual):

更改此:

$this->session->set_userdata('logged_in', $sess_array); 

进入这个:

$this->session->set_userdata($sess_array); 

然后阅读这样的会话数据:

$this->session->userdata('id'); 
$this->session->userdata('username'); 

好运!

+0

我完全错过了这个!无论是这个还是我的答案都可能是解决OP的问题,+1。 – NobleUplift

+0

这是我的问题。我不相信我弄错了。非常感谢! - 蒂姆 – user3249696

0

您的会话必须从第一个php文件的第一行开始,例如您将此文件包含到另一个文件中,您必须在第一个文件中执行此操作。

通常在你的代码的index.php

<?php 
session_start();//always on the first line of the file after opening the <?php also before any html code 

public function submit() 
{ 
$this->load->helper(array('form')); 
// authenticate 
$username = $this->input->post('txtLogin'); 
$password = $this->input->post('txtPassword'); 

//query the database 
$result = $this->user->login($username, $password); 

if($result) 
{ 

    $sess_array = array(); 
    foreach($result as $row) 
    { 
     $sess_array = array(
     'id' => $row->GebruikerID, 
     'username' => $row->Email 
     ); 
     $this->session->set_userdata('logged_in', $sess_array); 

     redirect('dashboard'); 
    } 
+0

对不起,你真的看过我的文章吗?我说得很清楚,我已经尝试过了。不管怎么说,还是要谢谢你。 - Tim – user3249696

0

删除的session_start()。 CodeIgniter将处理会话初始化。

因为CodeIgniter使用了一个名为会话,你需要先指定它使用PHP自身的会话:

session_name('ci_session'); 
session_start(); 

但你不应该这样做。CodeIgniter has a Session class的全部原因是充当原生PHP和CodeIgniter会话之间的接口(特别是与数据库一起使用时)。您不应该首先使用PHP会话方法。

实际上,通过运行session_start(),你可能会从笨会话到PHP本地会话切换,但你仍然在使用CodeIgniter的会议电话,所以没有被保存到您所使用的PHP会议。

+0

每页都做这个吗?或者就在我宣布会议的那个位置?谢谢 - Tim – user3249696

+0

CodeIgniter有自己的会话处理程序,它不使用PHP本地会话。 –

+0

@HashemQolami我在你发表评论的第二个字面上增加了一个到Session类的链接。凉。 OP,阅读我添加到我的答案的解释。是的,您必须在每个访问$ _SESSION数组的页面上使用session_name。 – NobleUplift

1

从每一个地方..

开放autoload.php,并设置删除session_start();

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

然后打开config.php文件,并设置:

$config['encryption_key'] = 'your-key-here';

然后尝试O设定会话如下:

$session_user = array(
    'id' => $row->GebruikerID, 
    'username' => $row->Email 
    ); 
    $this->session->set_userdata($session_user); 

然后转储是这样的:

print_r($this->session->userdata('id'));

print_r($this->session->userdata('username'));

尝试这一点,并检查该工作或不是

+0

OP说他/她已经有一个加密密钥。除非你暗指OP没有正确使用'set_userdata'方法。 – NobleUplift

+0

我刚刚添加了这个,这样任何人都可以寻求帮助:) –

+1

好主意!我在撰写问题时总是记住SEO。从来没有真正考虑过答案,+1。 – NobleUplift