Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从外部文件访问codeigniter会话值_Php_Session_Codeigniter - Fatal编程技术网

Php 从外部文件访问codeigniter会话值

Php 从外部文件访问codeigniter会话值,php,session,codeigniter,Php,Session,Codeigniter,在我的codeigniter项目中,我添加了KCK finder 它需要一些由codeigniter控制的会话值。 如何从外部文件访问CI会话值?想到两种解决方案(不涉及解码CI的cookie) 1) 分配内部CI时,将它们复制到常规PHP会话: $_SESSION['name'] = $this->session->userdata('name'); 因此,服务器上的每个php文件都可以使用它; 我相信这是最快的解决办法 2) 将会话保存到数据库并连接到数据库以检索值。您好,就在

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

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

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

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

$_SESSION['name'] = $this->session->userdata('name');
因此,服务器上的每个php文件都可以使用它; 我相信这是最快的解决办法


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

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

<?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');
?>
     //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);
//database.php文件的路径
require_once(“../frontend/config/database.php”);
$cisess_cookie=$_cookie['ci_session'];
$cisess_cookie=stripslashes($cisess_cookie);
$cisess_cookie=未序列化($cisess_cookie);
$cisess_session_id=$cisess_cookie['session_id'];
$cisess_connect=mysql_connect($db['default']['hostname'],$db['default']['username'],$db['default']['password']);
如果(!$CISSS\U连接){
死(“.mysql_error()”);
}
$cisess\U query=“从ci\U会话中选择用户\U数据,其中会话\U id='$cisess\U会话\U id';
mysql_select_db($db['default']['database'],$cisess_connect);
$cisess\U结果=mysql\U查询($cisess\U查询,$cisess\U连接);
如果(!$CISSS\U结果){
die(“无效查询”);
}
$cisess\U row=mysql\U fetch\U assoc($cisess\U result);
$cisess_data=unserialize($cisess_行['user_data']);
//打印所有会话值
打印数据;

我正在使用外部登录应用程序,希望使用CI会话中的数据。我找到了关于如何在不运行CI框架的情况下实现这一点的信息。对我来说,这是理想的,因为它将防止任何不兼容引起问题

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

  • 如果使用ci会话cookie,则仅获取会话cookie
  • 如果将ci会话与数据库一起使用,则获取会话cookie并在ci_会话表中查询数据库中的匹配项以验证会话
  • 使用数据并根据需要在cookie中添加数据(如果使用数据库会话,则在数据库中添加数据)
  • 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外部访问会话(它们是基于文件的),并且不希望加载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);
    

    关于“@Ben Swinburne”的更多信息,请回答:

  • 复制CI index.php文件并将其重命名(即,index_用于外部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>';
    
    //在ob_start中包含CI索引文件,以防止显示其他html
    ob_start();
    需要('../index_for_external_app.php')///您应该编辑此路径
    ob_end_clean();
    //打印会话变量以进行测试
    回声';
    打印(美元会话);
    回声';
    

  • 我从这个网站得到了一个解决方案,它可以工作,但需要一些修改。Codeigniter链接不工作这对我不起作用:您的系统文件夹路径似乎设置不正确。请打开以下文件并更正此问题:index.php这对我也不起作用。这
    包括('index.php')文件,我已经从外部\u codeigniter文件夹中包含了它。你能帮忙吗?答案很好,但缺少一些澄清:1。将CI index.php文件复制到新文件夹2中。打开index.php并相应地更改
    应用程序文件夹路径
    系统文件夹路径
    。我已经搜索了几个小时的解决方案,这是唯一一个工作正常的解决方案。这一个在CI项目之外工作得非常好。谢谢。这个解释让我的代码正常工作了