从外部文件访问 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 path
和 system 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 会话值的主要内容,如果未能解决你的问题,请参考以下文章