从外部文件访问codeigniter会话值

时间:2011-10-28 07:46:39

标签: php session codeigniter

在我的codeigniter项目中,我添加了KCK finder。

它需要一些由codeigniter控制的会话值。 如何从外部文件访问CI会话值?

7 个答案:

答案 0 :(得分:5)

<?php
    ob_start();
    include('index.php');
    ob_end_clean();
    $CI =& get_instance();
    $CI->load->library('session'); //if it's not autoloaded in your CI setup
    echo $CI->session->userdata('name');
?>

答案 1 :(得分:3)

如果您希望从codeigniter外部访问会话(并且它们是基于文件的)并且您不想加载CI,则可以执行以下操作:

define('ENVIRONMENT', 'development');

$ds = DIRECTORY_SEPARATOR;
define('BASEPATH', dirname(dirname(dirname(__FILE__))));
define('APPPATH', BASEPATH . $ds . 'application' . $ds);
define('LIBBATH', BASEPATH . "{$ds}system{$ds}libraries{$ds}Session{$ds}");

require_once LIBBATH . 'Session_driver.php';
require_once LIBBATH . "drivers{$ds}Session_files_driver.php";
require_once BASEPATH . "{$ds}system{$ds}core{$ds}Common.php";

$config = get_config();

if (empty($config['sess_save_path'])) {
    $config['sess_save_path'] = rtrim(ini_get('session.save_path'), '/\\');
}

$config = array(
    'cookie_lifetime'   => $config['sess_expiration'],
    'cookie_name'       => $config['sess_cookie_name'],
    'cookie_path'       => $config['cookie_path'],
    'cookie_domain'     => $config['cookie_domain'],
    'cookie_secure'     => $config['cookie_secure'],
    'expiration'        => $config['sess_expiration'],
    'match_ip'          => $config['sess_match_ip'],
    'save_path'         => $config['sess_save_path'],
    '_sid_regexp'       => '[0-9a-v]{32}',
);


$class = new CI_Session_files_driver($config);

if (is_php('5.4')) {
    session_set_save_handler($class, TRUE);
} else {
    session_set_save_handler(
        array($class, 'open'),
        array($class, 'close'),
        array($class, 'read'),
        array($class, 'write'),
        array($class, 'destroy'),
        array($class, 'gc')
    );
    register_shutdown_function('session_write_close');
}
session_name($config['cookie_name']);
session_start();
var_dump($_SESSION);

答案 2 :(得分:1)

更多清洁“ @Ben Swinburne”的答案:

  1. 复制CI index.php文件并重命名(即index_for_external_app.php)。

  2. 打开新的PHP文件(index_for_external_app.php),然后将以下变量编辑到外部路径:

    -$application_folder  
    -$system_path  
    [i.e. $system_path = '../../system';]  
    
  3. 从外部系统调用创建的PHP文件

    //include the CI index file within ob_start to prevent display other html
    ob_start();
    require('../../index_for_external_app.php');///You should edit this path
    ob_end_clean();
    
    //print the session variable for testing
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
    

答案 3 :(得分:0)

我想到了两个解决方案(不涉及解码CI的cookie)

1)当您分配内部CI时,将它们复制到常规PHP会话:

$_SESSION['name'] = $this->session->userdata('name');

所以你可以在服务器上的每个php文件中使用它; 我相信这是最快的解决方案。

2)将会话保存到数据库并连接到它以检索值。

答案 4 :(得分:0)

嗨,就在我通过谷歌搜索获得此代码之前。

     //path to your database.php file   
     require_once("../frontend/config/database.php");

     $cisess_cookie = $_COOKIE['ci_session'];
     $cisess_cookie = stripslashes($cisess_cookie);
     $cisess_cookie = unserialize($cisess_cookie);
     $cisess_session_id = $cisess_cookie['session_id'];

     $cisess_connect = mysql_connect($db['default']['hostname'], $db['default']      ['username'], $db['default']['password']);
     if (!$cisess_connect) {
       die("<div class=\"error\">" . mysql_error() . "</div>");
     }
     $cisess_query = "SELECT user_data FROM ci_sessions WHERE session_id =        '$cisess_session_id'";

     mysql_select_db($db['default']['database'], $cisess_connect);
     $cisess_result = mysql_query($cisess_query, $cisess_connect);
     if (!$cisess_result) {
       die("Invalid Query");
     }
     $cisess_row = mysql_fetch_assoc($cisess_result);
     $cisess_data = unserialize($cisess_row['user_data']);

     // print all session values 
     print_r($cisess_data);

答案 5 :(得分:0)

我正在使用外部登录应用,并希望使用CI会话中的数据。我在没有从CI框架运行任何内容的情况下找到了有关如何执行此操作的信息http://codeigniter.com/forums/viewthread/86380/。对我来说,这是理想的,因为它可以防止任何不兼容性导致问题。

如果您在从链接中提取信息时遇到问题:

  1. 如果使用ci会话cookie,则只获取会话cookie。
  2. 如果将ci会话与数据库一起使用,则获取会话cookie并在ci_session表中查询数据库中的匹配项以验证会话。
  3. 在cookie中使用数据并根据需要添加数据(如果使用数据库会话,则在数据库中)。

答案 6 :(得分:0)

Bens回答include(&#39; index.php&#39;)并且获取CI实例并不错,但在我的情况下,这些操作太慢了。

因为我已经将codeigniter设置为使用文件,所以我提出了一个更快的解决方案:

getActivity()

希望它有所帮助!