PHP(CodeIgniter)会话清空

时间:2014-01-29 16:23:08

标签: php codeigniter session session-variables

我正在尝试在CodeIgniter中构建一个Login系统。到目前为止一切正常,直到我必须将细节保存到SESSION中。我尝试了很多东西,但是我尝试了多少,当我转储它时,SESSION数组是空的。

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。

这就是诀窍:

  

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

     

改变这个:

     

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

     

进入这个:

     

$这 - &GT;会话而&GT; set_userdata($ sess_array);

     

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

     

$这 - &GT;会话而&GT;用户数据( '编号');      $这 - &GT;会话而&GT;用户数据( '用户名');

     

祝你好运!

4 个答案:

答案 0 :(得分:2)

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

改变这个:

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

进入这个:

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

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

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

祝你好运!

答案 1 :(得分:1)

从每个地方删除session_start(); ..

打开autoload.php并设置:

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

然后打开config.php并设置:

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

然后按如下方式尝试设置会话:

 $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'));

试试这个并检查这项工作

答案 2 :(得分: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');
   }

答案 3 :(得分:0)

从代码中删除session_start()。 CodeIgniter将处理会话初始化。

因为CodeIgniter使用命名会话,所以您需要首先指定它以使用PHP本机会话:

session_name('ci_session');
session_start();

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

实际上,通过运行session_start(),您可能会从CodeIgniter会话切换到PHP本机会话,但您仍在使用CodeIgniter会话调用,因此不会将任何内容保存到您正在使用的PHP会话中。< / p>