Codeigniter, массивы $ _SESSION - PullRequest
       0

Codeigniter, массивы $ _SESSION

0 голосов
/ 01 октября 2010

Я пытаюсь использовать собственные массивы $ _SESSION в Codeigniter, потому что я не могу использовать массивы $ _COOKIES, поэтому я создал свой собственный класс, но кажется, что Codeigniter продолжит сохранять данные в кокки, потому что если я отключу файлы cookie браузера, я могу 't получить данные $ _SESSION: O !!невероятно .... я не могу понять почему?codeigniter останавливает или удаляет все заданные данные $ _SESSION?

Есть ли кто-то, кто все еще использует только массивы $ _SESSION, отменяя параметр $ _COOKIE по умолчанию по умолчанию?я имею в виду, что я хотел бы иметь данные сеанса, а не данные cookie, но это кажется невозможным: O !!! ?? !!

Я переименовал исходную библиотеку Cession.php в CI в Cookie.php, и затемя сделал два личных класса в приложении / библиотеках и по умолчанию загружаю их в autoloader.php

1) Личная библиотека - Session.php

session_start();

class Session {


     function set_data($key,$data)
    {

      if(!$key)
      { echo 'first param passed is null in session set_data';}
      if(!$data)
      { echo 'second param passed is null in session set_data';}
     if(isset($key) && isset($data))
     {
         if(isset($_SESSION[$key]))
         {
             unset($_SESSION[$key]);
         }

      return $_SESSION[$key] = $data;


     }
  function keep_data($key)
    {

       if(!$key)
      { echo 'first param passed is null in session keep_data';}

       if(isset($_SESSION[$key]))
       {
         return htmlentities($_SESSION[$key]);
       }
    }

2) Личная библиотека -Settings.php

class Settings {


     function setsitelanguage()
    {
        $CI =& get_instance();

        if($CI->session->keep_data('lang'))
        {
            $CI->config->config['language'] = $CI->session->keep_data('lang');
        }
        else
        {
          $CI->config->config['language'] = "en";
        }

    } 

чем у меня есть 2 контроллера


1) Контроллер Home.php

class Home extends Controller {

    function Home()
    {

        parent::Controller();

               $this->settings->setsitelanguage();

        }


    function index()
    {
        $this->load->view('home/home_view');

    }
        function session()
        {
           echo   $this->session->keep_data('lang');
        }

} 

2) КонтроллерAuth.php

class Auth extends Controller {


     function usersetlang()
    {

               $lang = $this->uri->segment(3);

              return $this->session->set_data('lang',$lang);





        }
}

, как показано в http://mysite/index.php/home/session, я могу получить свой языковой сайт, сохраненный в файле session.php, с помощью auth.php, единственная проблема заключается в том, что недостаточно использовать глобальный $_SESSION[], потому что, если я пытаюсь получить данные, отключающие файлы cookie моего браузера, $_SESSION[] данные не отображаются !!!

Ответы [ 6 ]

6 голосов
/ 01 октября 2010

$ _ Переменные SESSION могут отсутствовать в самих файлах cookie, но PHP все еще должен иметь возможность отслеживать сеанс пользователя, чтобы переменные $ _SESSION были постоянными, и он использует файлы cookie для этого отслеживания.* PHP пытается сохранить состояние сеанса, если куки отключены, передавая переменную сеанса в URL, но это не очень надежно.

Итог - если вы хотите сеансданные в веб-среде, вам нужно включить куки.Извините.

Вы говорите, что не можете использовать куки, но вы на самом деле не объяснили почему.В наши дни довольно редко люди хотят отключить файлы cookie, поскольку они используются практически везде.

5 голосов
/ 13 сентября 2012

Мы могли бы использовать $_SESSION, если сделаем session_start(); Дело в том, что $_SESSION не будет работать на страницах с кодовым указателем.

Быстрое исправление:

Поскольку страницыв MVC запускаются контроллером, мы могли бы сделать это

public function __construct(){
    self::$instance =& $this;
    foreach (is_loaded() as $var => $class) {
        $this->$var =& load_class($class);
    }

    $this->load =& load_class('Loader', 'core');

    $this->load->initialize();

    log_message('debug', "Controller Class Initialized");
    session_start();
}

для CI_Controller класса на system/core/Controller.php

Это сработало!

3 голосов
/ 01 октября 2010

Да, вы можете сделать это

создать эту таблицу:

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(16) DEFAULT '0' NOT NULL,
user_agent varchar(50) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id)
);

и изменить ее в конфигурации:

$config['sess_use_database'] = FALSE;

на

$config['sess_use_database'] = TRUE;

$config['sess_table_name'] = 'ci_sessions'; должно соответствовать имени вашей таблицы.

Для пояснения - по умолчанию система сеансов CI использует cookie для хранения данных.Не знаю почему, просто так.Вы можете изменить это для безопасности и т. Д., Используя вместо этого таблицу базы данных.

Вы получаете доступ к значениям сеанса в точности так же, но не ограничены максимальными размерами файлов cookie или угрозами безопасности.конечно, можно использовать обычные $ _SESSIONS и создать свой собственный скрипт - помните, что CI - это фреймворк, вам не нужно использовать все это.

2 голосов
/ 01 октября 2010

С каких это пор CodeIgniter блокирует $ _SESSION?Если вы хотите использовать сеанс, вы должны начать его.Для этого вам нужно где-то написать session_start ().почему не в вашем index.php?

CodeIgniter - это просто PHP, а не какой-то злой темный маг.

0 голосов
/ 01 октября 2010

Если вы не можете распространять идентификатор сеанса через куки, вы можете сделать это через URL.

См .: http://www.php.net/manual/en/session.idpassing.php

0 голосов
/ 01 октября 2010

Файл cookie, в котором хранится сторона браузера PHPSESSID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...