从外部文件访问 codeigniter 会话值

Posted

技术标签:

【中文标题】从外部文件访问 codeigniter 会话值【英文标题】:access codeigniter session values from external files 【发布时间】:2011-12-17 02:35:28 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:
<?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');
?>

【讨论】:

这对我不起作用:您的系统文件夹路径似乎设置不正确。请打开以下文件并更正:index.php 这对我也不起作用。这个include('index.php'); 文件,我已经从 external_codeigniter 文件夹中包含了它。你能帮忙吗? 很好的答案,但缺少一些说明:1. 将 CI index.php 文件复制到新文件夹中 2. 打开 index.php 并相应地更改 application folder pathsystem folder path【参考方案2】:

如果您希望从 codeigniter 外部访问会话(并且它们是基于文件的)并且您不想加载 CI,您可以这样做:

define('ENVIRONMENT', 'development');

$ds = DIRECTORY_SEPARATOR;
define('BASEPATH', dirname(dirname(dirname(__FILE__))));
define('APPPATH', BASEPATH . $ds . 'application' . $ds);
define('LIBBATH', BASEPATH . "$dssystem$dslibraries$dsSession$ds");

require_once LIBBATH . 'Session_driver.php';
require_once LIBBATH . "drivers$dsSession_files_driver.php";
require_once BASEPATH . "$dssystem$dscore$dsCommon.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);

【讨论】:

我一直在寻找解决方案几个小时,这是唯一一个完美的解决方案。这个完美地在 CI 项目之外工作。谢谢。【参考方案3】:

随着对“@Ben Swinburne”回答的更多清理:

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

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

    -$application_folder  
    -$system_path  
    [i.e. $system_path = '../../system';]  
    

    从您的外部系统调用创建的 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>';
    

【讨论】:

【参考方案4】:

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

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

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

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

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

【讨论】:

我从这个网站renownedmedia.com/blog/…得到了一个解决方案,它可以工作,但需要一些修改。【参考方案5】:

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

     //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);

【讨论】:

【参考方案6】:

我正在使用外部登录应用程序并希望使用来自 CI 会话的数据。我找到了这个信息http://codeigniter.com/forums/viewthread/86380/,关于如何在不从 CI 框架运行任何东西的情况下做到这一点。对我来说这是理想的,因为它可以防止任何不兼容性引起问题。

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

    如果使用 ci 会话 cookie,则仅获取会话 cookie。 如果对数据库使用 ci session,则获取 session cookie 并在 ci_session 表中查询数据库中的匹配项以验证 session。 使用数据并根据需要在 cookie 中添加数据(如果使用数据库会话,则在数据库中)。

【讨论】:

Codeigniter 链接不起作用【参考方案7】:

Bens 使用 include('index.php') 回答并获取 CI 实例还不错,但在我的情况下,这些操作太慢了。

由于我已将 codeigniter 设置为使用文件,因此我制作了这个更快的解决方案:

function CIsession()

    $pathToSessionFiles = 'path/to/files/set/in/codeigniter/config/';

    $h = md5($_SERVER['REMOTE_ADDR']); // $config['sess_match_ip'] = TRUE;
    foreach( glob($pathToSessionFiles . '*' ) as $f )
       
        if( strpos($f, $h) )  $s[ $f ] = filemtime($f); 
    
    arsort($s);
    $s = array_keys($s);
    $s = reset($s);
    $s = file($s);
    $s = reset($s);
    $s = explode(';', $s);
    foreach($s as $k => $v)
    
        $s[$k] = str_getcsv($v, ":", '"');
        $s[$k][0] = substr(reset($s[$k]), 0, strpos(reset($s[$k]), '|'));

        $s[reset($s[$k])] = end($s[$k]);
        unset($s[$k]);
    

    return $s;

希望它对某人有所帮助!

【讨论】:

以上是关于从外部文件访问 codeigniter 会话值的主要内容,如果未能解决你的问题,请参考以下文章

在外部 js 文件中使用会话

使用 CodeIgniter 加载视图文件夹外的视图

PHP-CODEIGNITER如何在会话中获取数据

codeigniter 无法访问另一个控制器中的会话数据

是否可以从外部 js 文件访问 Svelte 商店?

两个 CodeIgniter 应用程序会话相互覆盖