6

I can't seem to get session data passed from my codeigniter application back to a script in my includes folder. From what I've read on other answers, I need to set my session_id() to be able to rejoin a session with session_start().

ROOT /
     .. /application
     .. /system
     .. /includes
        .. /Events.php <- I need access from here

Theoretically the code below should work, at least according to other answers, because the new CI session library passes on to native sessions.

session_id($_COOKIE['ci_session']);
session_start();
var_dump($_SESSION); // returns null

Am I misunderstanding sessions?

acupofjose
  • 2,159
  • 1
  • 22
  • 40
  • Possible duplicate of [access codeigniter session values from external files](http://stackoverflow.com/questions/7926455/access-codeigniter-session-values-from-external-files) – Aziz Saleh May 05 '17 at 12:10

3 Answers3

8

The original answer from @wolfgang1983 Ben Swinburne combined with an answer here: from Atiqur Rahman Sumon

You can include the index.php from any directory, however, you need to change the $system_path and $application_folder variables to match your relative location. Well that's great if you want to completely change your whole application's paths, but I didn't want to, so I just copied the index.php file into the directory I needed to include codeigniter with.

ROOT /
     .. /application
     .. /system
     .. /includes
        .. /Events.php <- I need access from here
        .. /index.php <- Copied CI index with new paths
     .. /index.php

In /includes/index.php:

//$system_path = 'system';
$system_path = '../system';

//$application_folder = 'application';
$application_folder = '../application';

Now you can include codeigniter in your file with the:

<?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');
?>

If you refresh your page now, you would end up with the default controller loaded.

So taking from Atiqur Rahman Sumon's answer, we can define a constant before load to tell the default controller we want to skip it's normal callstack.

ob_start();
define("REQUEST", "external"); <--
include('index.php');
ob_end_clean();

And in your default_controller.php:

function index()
{
    if (REQUEST == "external") {
        return;
    } 

    //other code for normal requests.
}
Community
  • 1
  • 1
acupofjose
  • 2,159
  • 1
  • 22
  • 40
3

Improving on @acupajoe's answer, you don't have to copy-paste the CI index.php. Instead change the include part into this:

<?php
    ob_start();
    define("REQUEST", "external");
    $temp_system_path = 'path/to/system/folder/from/external/file';
    $temp_application_folder = 'path/to/application/folder/from/external/file';
    include('path/to/index.php/file/from/external/file');
    ob_end_clean();
    $CI =& get_instance();
    //...
?>

Then change in index.php:

$system_path = isset($temp_system_path) ? $temp_system_path : 'system';

and

$application_folder = isset($temp_application_folder) ? $temp_application_folder : 'application';
Obay
  • 3,135
  • 15
  • 55
  • 78
  • Thumbs up for `define("REQUEST", "external");`. Add this line and your site won't redirect to other pages if your `index.php` always redirecting to other pages. – Frank Sep 15 '18 at 02:17
1

I found this access codeigniter session values from external files it may help what you after.

<?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');
?>
Community
  • 1
  • 1