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

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

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

【问题讨论】:

    标签: php session codeigniter


    【解决方案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 . "{$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);
    

    【讨论】:

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

    随着对“@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>';
      

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

      【解决方案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 框架运行任何东西的情况下做到这一点。对我来说这是理想的,因为它可以防止任何不兼容性引起问题。

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

        1. 如果使用 ci 会话 cookie,则仅获取会话 cookie。
        2. 如果对数据库使用 ci session,则获取 session cookie 并在 ci_session 表中查询数据库中的匹配项以验证 session。
        3. 使用数据并根据需要在 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;
        }
        

        希望它对某人有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-29
          相关资源
          最近更新 更多