11

I would like to have some help in CodeIgniter 3. Every time I login and redirect to the index page, session is lost.

Here is my code:

Controller:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Secretariat extends CI_Controller {
    public function __construct(){
        parent::__construct();
        $this->load->helper(array('form', 'url'));
        $this->load->model('SecretariatModel');
        $this->load->model('IndiRegModel');
        $this->load->model('RoomModel');
        $this->load->model('BuildingModel');
        $this->load->model('BilletModel');
        $this->load->model('BatchRegModel');
        $this->load->library('form_validation');
        $this->load->library('session');
    }

    public function secretariatLogin(){

        if ($this->session->isSecretariat){
            redirect('secretariat/index', $data);


        } else{

            $data['title'] = 'PACSA - Philippine Association of Campus Student Adviser';

            $this->load->view('include/toppage', $data);
            $this->load->view('include/defaultnavbar', $data);
            $this->load->view('pacsa/slider');
            $this->load->view('secretariat/secretariatLogin', $data);
            $this->load->view('include/bottompage');

       }

    }

    public function signin(){
        $secretariat = array(
            'sec_email' => $this->input->post('sec_email'),
            'sec_password' => sha1($this->input->post('sec_password'))
        );

        $user = $this->SecretariatModel->getSecretariat($secretariat);
        //print_r($user->name);die();

        if(!$user == null){

            $newdata = array(
                'sec_id' => $user->sec_id,
                'sec_name'  => $user->sec_name,
                'sec_lastname' => $user->sec_lastname,
                'sec_email' => $user->sec_email,
                'sec_password' => $user->sec_password,
                'sec_status' => $user->sec_status,
                'sec_address' => $user->sec_address,
                'logged_in' => TRUE,
                'isSecretariat' => TRUE
            );

            $this->session->set_userdata($newdata);            
            redirect('secretariat/index');
        } else {
            $data['title'] = 'PACSA - Philippine Association of Campus Student Adviser';
            $data['message'] = 'Invalid email or password';

            $this->load->view('include/toppage', $data);
            $this->load->view('include/defaultnavbar', $data);
            $this->load->view('pacsa/slider');
            $this->load->view('secretariat/secretariatLogin', $data);
            $this->load->view('include/bottompage');
        }
    }    

    public function index(){
        $data['title'] = 'PACSA - Philippine Association of Campus Student Adviser';
        $id = $this->session->sec_id;
        var_dump($id);
        echo die();

        $this->load->view('include/toppage', $data);
        $this->load->view('include/secretariatnavbar', $data);
        $this->load->view('pacsa/slider');
        $this->load->view('secretariat/index', $data);
        $this->load->view('include/bottompage');
    }
}

So after redirecting to the index page, I want to verify if there is a session involved. I tried to echo the id and the name of the user but I get a null value.

cusmar
  • 1,903
  • 1
  • 20
  • 39
Kyle Cipriano
  • 151
  • 1
  • 1
  • 9

10 Answers10

20

also check your php.ini file for this option:

session.auto_start=1
Sofyan Thayf
  • 1,322
  • 2
  • 14
  • 26
  • where can i locate the .ini file? – Kyle Cipriano Jan 28 '18 at 10:39
  • what is your OS or server platform? Usually session problem occur when I running my web on localhost using XAMPP. The php.ini is in **drive:/xampp/php/** or you can create a new **.php** file on your server, and write following code: `` and open it from your browser, it will show all parameters of your server including your php configuration file (**php.ini**) location – Sofyan Thayf Jan 28 '18 at 12:38
  • Works for me. I thought the problem is in the framework! Thank you! – Albert Israel Nov 25 '18 at 07:59
  • Worked for me! The problem was with XAMPP on mac. By default it is set to session.auto_start=0 – CaptainZero Feb 04 '19 at 08:10
  • I lost almost days and days to find as this simple and perfectly answer to Codeigniter Session problem! Thanks Sofyan! – MR.Internet Sep 10 '20 at 15:24
19

Go to

system/libraries/Session/session.php

at Line no 281 and replace

ini_set('session.name', $params['cookie_name']); 

by

ini_set('session.id', $params['cookie_name']);

This problem occurs normally while upgrading PHP later version to 7.3 +

Nikunj Dhimar
  • 2,296
  • 19
  • 24
2

Have you loaded your session library

this->load->library('session')

Or via autoload

$autoload['libraries'] = array('session');

Ntiyiso Rikhotso
  • 644
  • 6
  • 15
2

i just solved my problem turns out i have old version of codeigniter 3 i upgrade my CI to the latest version available on the website . thank you all for the help

Kyle Cipriano
  • 151
  • 1
  • 1
  • 9
1

Hope this helps, I'm working with Homestead - Vagrant - php7.4 and the only way I got it working was following this answer on Github

Add this in your

Project/application/config/config.php

 /* 
 |-------------------------------------------------------------------------- 
 | Cookie Related Variables 
 |-------------------------------------------------------------------------- 
 | 
 | 'cookie_prefix'   = Set a cookie name prefix if you need to avoid collisions 
 | 'cookie_domain'   = Set to .your-domain.com for site-wide cookies 
 | 'cookie_path'     = Typically will be a forward slash 
 | 'cookie_secure'   = Cookie will only be set if a secure HTTPS connection exists. 
 | 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript) 
 | 
 | Note: These settings (with the exception of 'cookie_prefix' and 
 |       'cookie_httponly') will also affect sessions. 
 | 
 */ 
 $config['cookie_prefix']   = ''; 
 $config['cookie_domain']   = ''; 
 $config['cookie_path']     = '/'; 
 $config['cookie_secure']   = FALSE; 
 $config['cookie_httponly']     = FALSE; 

also change lines from 289 to 352 in your

Project/system/core/Input.php

/** 
 * Set cookie 
 * 
 * Accepts an arbitrary number of parameters (up to 7) or an associative 
 * array in the first parameter containing all the values. 
 * 
 * @param   string|mixed[]  $name       Cookie name or an array containing parameters 
 * @param   string      $value      Cookie value 
 * @param   int     $expire     Cookie expiration time in seconds 
 * @param   string      $domain     Cookie domain (e.g.: '.yourdomain.com') 
 * @param   string      $path       Cookie path (default: '/') 
 * @param   string      $prefix     Cookie name prefix 
 * @param   bool        $secure     Whether to only transfer cookies via SSL 
 * @param   bool        $httponly   Whether to only makes the cookie accessible via HTTP (no javascript) 
 * @return  void 
 */ 
public function set_cookie($name, $value = '', $expire = 0, $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL) 
{ 
    if (is_array($name)) 
    { 
        // always leave 'name' in last place, as the loop will break otherwise, due to $$item 
        foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) 
        { 
            if (isset($name[$item])) 
            { 
                $$item = $name[$item]; 
            } 
        } 
    } 
  
    if ($prefix === '' && config_item('cookie_prefix') !== '') 
    { 
        $prefix = config_item('cookie_prefix'); 
    } 
  
    if ($domain == '' && config_item('cookie_domain') != '') 
    { 
        $domain = config_item('cookie_domain'); 
    } 
  
    if ($path === '/' && config_item('cookie_path') !== '/') 
    { 
        $path = config_item('cookie_path'); 
    } 
  
    $secure = ($secure === NULL && config_item('cookie_secure') !== NULL) 
        ? (bool) config_item('cookie_secure') 
        : (bool) $secure; 
  
    $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL) 
        ? (bool) config_item('cookie_httponly') 
        : (bool) $httponly; 
  
    if ( ! is_numeric($expire) OR $expire < 0) 
    { 
        $expire = 1; 
    } 
    else 
    { 
        $expire = ($expire > 0) ? time() + $expire : 0; 
    } 
  
    setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); 
} 
Jorgeeadan
  • 343
  • 8
  • 20
1

I experienced this problem with the $config['sess_driver'] set to 'database'.

I was using a valid MySQL user so CodeIgniter 3 was not complaining about the sql connection but the user did not have all the right permissions to read/write from the table php_sessions (or the one set by $config['sess_save_path']).

In my case, I was using the default user 'debian-sys-maint' in my database.php.

0

Your problem doesn't come from the session itself.

Try to:

  • Comment the redirect method and add a var_dump($user) instead to see if your $user is correctly set. The problem could come from your $user object which contains null values for id and name.

  • Change if(!$user == null){ by if ($user != null) { or if ($user) {.

cusmar
  • 1,903
  • 1
  • 20
  • 39
  • Thank you. ok i tried to use var_dump on the $user and i got all the data from the user which i try to login then i did what you told me to change the if statement but when i use the var dump on the index to check if i get the id and name from the session, i still get NULL value – Kyle Cipriano Jan 28 '18 at 11:40
  • In your index method, can you tell me the result of `var_dump($this->session->userdata())`? – cusmar Jan 28 '18 at 11:46
  • hmmm i got this result array(1) { ["__ci_last_regenerate"]=> int(1517140453) } – Kyle Cipriano Jan 28 '18 at 11:54
  • Comment the `redirect('secretariat/index');` line again, and add this instead, just after `set_userdata`: `var_dump($this->session->userdata());`. What is the result here? – cusmar Jan 28 '18 at 11:57
  • i got this result array(10) { ["__ci_last_regenerate"]=> int(1517140803) ["sec_id"]=> string(1) "1" ["sec_name"]=> string(11) "Secretariat" ["sec_lastname"]=> string(9) "asdfghjkl" ["sec_email"]=> string(11) "secretariat" ["sec_password"]=> string(40) "92a87dfd4ec6c963caeb9e47ea97dd6f4f9c8441" ["sec_status"]=> string(6) "Single" ["sec_address"]=> string(10) "asdfghjkl;" ["logged_in"]=> bool(true) ["isSecretariat"]=> bool(true) } i got all the data from the user which i am trying to log in – Kyle Cipriano Jan 28 '18 at 11:59
  • Which driver are you using to store your sessions? Look at [Database Driver](https://www.codeigniter.com/user_guide/libraries/sessions.html#database-driver), and try again after you create the `ci_sessions` table and change your config file as it is said in the link below. Does it work? – cusmar Jan 28 '18 at 12:02
  • here's what i found on my config file : $config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = NULL; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = FALSE; should i set my 'sess_save_path' to ci_session? and my 'sess_driver' to database? will try this one thanks – Kyle Cipriano Jan 28 '18 at 12:18
  • Yes you should try and create a new table in your database as it is explicated on the [documentation link](https://www.codeigniter.com/user_guide/libraries/sessions.html#database-driver). – cusmar Jan 28 '18 at 12:21
  • when i set my 'sess_driver' to database am i going to literally put 'database' or am i going to put my database name – Kyle Cipriano Jan 28 '18 at 12:30
  • Only put the word "database" – cusmar Jan 28 '18 at 12:32
  • i got this error Severity: Warning Message: Use of undefined constant ci_sessions - assumed 'ci_sessions' (this will throw an Error in a future version of PHP) Filename: config/config.php Line Number: 373 Backtrace: File: C:\xampp\htdocs\pacsa\application\config\config.php Line: 373 Function: _error_handler File: C:\xampp\htdocs\pacsa\index.php Line: 316 Function: require_once – Kyle Cipriano Jan 28 '18 at 12:37
  • What did you do in your config file? Show me the line 373 – cusmar Jan 28 '18 at 12:40
  • $config['sess_driver'] = 'database'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = ci_sessions; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = FALSE; – Kyle Cipriano Jan 28 '18 at 12:42
  • Add quotes to ci_sessions: `$config['sess_save_path'] = 'ci_sessions';` – cusmar Jan 28 '18 at 12:43
  • ok i got rid of the error message but when i try to use var_dump on the index to check if i get the name and is from the session i dont have any output even the "NULL" data didn't show – Kyle Cipriano Jan 28 '18 at 12:48
  • Did you try to login again? – cusmar Jan 28 '18 at 12:52
  • Add this in your index method: `var_dump($this->session->userdata());`, which result did you get? – cusmar Jan 28 '18 at 12:57
  • array(1) { ["__ci_last_regenerate"]=> int(1517145328) } – Kyle Cipriano Jan 28 '18 at 13:15
  • Try to add this instead of the redirect method (comment it): `$result = $this->session->set_userdata($newdata); var_dump($result);die;` – cusmar Jan 28 '18 at 13:23
  • i just solved my problem turns out i have old version of codeigniter 3 i upgrade my CI to the latest version available on the website . thank you all for the help – Kyle Cipriano Jan 31 '18 at 10:36
0

If you are using PHP 7.1+/7.2 then this problem will happen. Change PHP version to down (to check if it works).

Prince John
  • 75
  • 1
  • 2
  • 10
  • I've used CodeIgniter 3 with PHP 7.2 and sessions worked fine. Your answer is not very helpful. Suggesting a different version of PHP doesn't solve anything. – Brian Gottier Jan 28 '18 at 16:34
  • I have faced this issue with one of my application in localhost and also in live server then I changed PHP version now it works perfectly. – Prince John Jan 29 '18 at 06:45
0

We also get same issues. our spec : InvoicePlane, PHP 7.0, code igniter v.3.1.11. Every controllers which use redirect() helper got err_connection_refused from browser.

After spend hours exhaustive debugging. We solved this by change IP Address base_url to domain name and set certificate from letsencrypt.

Brain90
  • 1,551
  • 18
  • 21
-1

Try this

$this->output->profiler(true);

To see if session is really set and also check if the library is loaded

Ntiyiso Rikhotso
  • 644
  • 6
  • 15