2014-01-29 116 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