Почему всякий раз, когда я обновляю страницу, создается новый сеанс CI? - PullRequest
0 голосов
/ 13 декабря 2011

Я создал простую систему входа в систему и использовал сеансы CI для хранения некоторых значений.
Но сеансы CI работали не так, как ожидалось, он не извлекал никакого значения.
Я пытался отследить проблемуи я кое-что выяснил:
Всякий раз, когда я обновляю страницу, создается новый сеанс!
И только 1 сеанс содержит мои пользовательские переменные (is_logged, username).
Другие сеансы просто удерживаютданные по умолчанию.
Я попытался сохранить сеансы в базе данных, но проблема все еще та же.
Это мой ключ шифрования?
Я просто использовал несколько случайных букв, потому что не могу оставить их пустыми.
Это контроллер, на котором я тестировал свои сеансы.
Примечание:
Я использую некоторые echo здесь, просто для тестирования.
Примечание2:
Я могу получить переменные сеансатолько если я позвоню на той же странице.

 <?php

class site extends CI_Controller {

    function index() {
        if (!$this->session->userdata('is_logged')) {
            $data['main_content'] = 'site_view';
            $this->load->view('template/all_templates', $data);
        } else {
            echo 'you\'re logged already';
        }
    }

    function login() {
        if (!$this->session->userdata('is_logged')) {
            $username = $this->input->post('username');
            $password = $this->input->post('password');
            if ($username && $password) {
                if ($this->site_model->validate($username, $password)) {
                    $user_data = array('username' => $username, 'is_logged' => TRUE);
                    $this->session->set_userdata($user_data);
                    echo 'you successfully log in.';
                    redirect('site/index', 'refresh');
                } else {
                    echo 'cannot login';
                }
            } else {
                echo 'username and/or password not set';
            }
        } else {
            echo 'you\'re logged in already!';
        }
    }
}
?>

Примечание:
Этот вопрос относится к этому вопросу

Edit1:
Я входил в систему несколько раз, иногда без ошибок.
После нескольких обновлений /входы, см. базу данных sesssion:

02d6e3521046ffe7df36b07e88624a60    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803371  
66a9cf3d6b7e0521dcc7e5bd3d5d4ad1    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803380  
923a78db029ee3e3ae4bf9e09873fcae    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803366  a:3:{s:9:"user_data";s:0:"";s:8:"username";s:4:"aziz";s:9:"is_logged";b:1;}
99ac075792b7818aadac60d00ca46947    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803367  
bbe10f3338226c8d83b0ae58d1ca5149    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803343  a:3:{s:9:"user_data";s:0:"";s:8:"username";s:4:"aziz";s:9:"is_logged";b:1;}
ed6a22ae1d2fd21b6ef66668c2078a11    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803375  
feb5806176dc8a4f7ed8f30763f65f8b    127.0.0.1   Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K  1323803380  a:3:{s:9:"user_data";s:0:"";s:8:"username";s:4:"aziz";s:9:"is_logged";b:1;}  

Как вы можете заметить, некоторые результаты с данными пользователя.

моя функция проверки:

function validate($username, $password) {

    $this->db->where('username', $username);
    $this->db->where('password', $password);
    $query = $this->db->get('users');
    if ($query->num_rows() == 1) {
        return true;
    } else {
        return false;
    }
}  

Примечание:
Я тестировал в FF & Chrome.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Азиз пару месяцев назад у меня было много проблем с оригинальной библиотекой сеансов CI (включая то, что вы упомянули). Наконец я пришел к этой замене, которая использует native PHP session. Это работает!
Поверьте мне, в середине проекта я не переставал удивляться, почему. Просто работает.

Вот оно: Родная сессия Codeigniter (внизу есть ссылка для скачивания)

НО, из-за того, что это старая библиотека, вы ДОЛЖНЫ сделать несколько хаков. Вы можете проверить эти простые хаки на форуме библиотеки

Просто поместите этот файл в каталог библиотеки codeigniter. И давайте поговорим о прямой совместимости после, я имею в виду это! :)

0 голосов
/ 13 декабря 2011

Попробуйте это:

function index() 
{
  if(!$this->session->userdata('is_logged'))
  {
     $data['main_content'] = 'site_view';
     $this->load->view('template/all_templates', $data);
  }
  else
  {
    echo 'you\'re logged already';
  }
}

function login() 
{
  if(!$this->session->userdata('is_logged'))
  {
    $username = $this->input->post('username');
    $password = $this->input->post('password');
    if($username && $password)
    {
      if($this->site_model->validate($username,$password))
      {
       $user_data = array('username' => $username,'is_logged' => TRUE);
       $this->session->set_userdata($userdata);
       echo 'you successfully log in.';
       //redirect('somewhere','refresh');
      }
      else
      {
        echo 'cannot login';
      }
    }
    else
    {
      echo 'username and/or password not set';
    }
   }
   else
   {
     echo 'you\'re logged in already!';
   }
}

Примечание:

  1. вам нужно загрузить библиотеку сессий и site_model;
  2. вы не можете вызывать сеанс сразу послеустановить его, так как он будет доступен только по последующему запросу;на самом деле сеансы CI - это файлы cookie.
  3. echo с целью иллюстрации потока, вы должны изменить их на представления или перенаправления или что-то еще
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...