Codeigniter: Проблем със сесиите

Pavkatar

Registered
Здравейте, ;)
имам проблем със сесиите в CI, не знам защо от модела или контролера не мога да задам сесия... не става дума само за стандартните CI сесии, а и за библиотеката с php сесии. От view-то за теста зададох сесия, но през модела или контролера нестава.

Не знам може ли да е от това, но достигам файла с Ajax, прави си проверките и при съвпадение трябва да запише сесия, но нестава..

Автоматично зареждам библиотеката и не знам какво може де е? :(
 
Така без код не виждам от какво може да идва проблемът. Ако искаш пробвай това. В php файлът, който ти обработва ajax заявката, направи така:

$CI =& get_instance();
$CI->load->library('session');
$CI->session->set_userdata('some_name','some_value');

Защото ако функцията, която обработва ajax заявката не ти е метод на някой контролер или модел няма да има достъп до класовете на CI и може затова да не се сетва сесия.

Също ако използваш PHP сесиите, сигурен ли си, че си написал session_start(); ? :)
 
Ами ето малко кодове, защото пак нестава :(

Това имам в библиотеката phpsession най-отгоре:

Код:
session_start();
$CI =& get_instance();
$CI->phpsession = new PhpSession();
$CI->ci_is_loaded[] = 'phpsession';

това ми е Ajax контролера:
Код:
class Ajax extends Controller{

    function index(){
        redirect(base_url(), 'refresh');
    }
    function login(){
        $this->load->model('members');
        $username = $this->input->post('username');
        $password = sha1($this->input->post('password'));
        
        if($this->members->validateLogin($username,$password)){

            $this->phpsession->save('username',$username);
            $this->phpsession->save('password',$password);

            $this->members->username = $username;
            echo 'yes';
        }else{
            echo "Грешни потребителско име и/или парола!";
        }
    }
}

това ми е members модела:
Код:
<?php

class Members extends Model{

    var $logged_in;
    var $username = false;
    
    function  __construct() {
        parent::Model();
        
        $this->logged_in = $this->checkLogin();
    }

    function checkLogin(){
        $username = $this->phpsession->get('username');
        $password = $this->phpsession->get('password');
        
        if( ( isset($username) ) AND (isset($password) ) )
        {
            if($this->confirmUserPass($username, $password) != 0){
                $this->phpsession->clear('username');
                $this->phpsession->clear('password');
                return False;
            }else{
                $this->username = $username;
                return True;
            }
        }
        else
        {
            return False;
        }
    }

    function validateLogin($username = false,$password = false){
        
        if(!$username){
            $username = $this->input->post('username');
        }
        if(!$password){
            $password = sha1($this->input->post('password'));
        }
        $this->db->where('username',$username);
        $this->db->where('password',$password);

        $checkUsers = $this->db->get('users');

        if($checkUsers->num_rows() == 1){

            //$this->phpsession->save('username',$username);
            //$this->phpsession->save('password',$password);
            
            $this->username = $username;
            $this->logged_in = true;
            return True;
        }else{
            return False;
        }
    }

    function confirmUserPass($username,$password){
        $query = $this->db->query("SELECT password FROM users WHERE username= binary '".$username."'");
        if( (!$query) || ($query->num_rows() == 0) ){
            return 1; //Username failure
        }else{
            $dbPassword = $query->result();
            if($password == $dbPassword){
                return 0; // Everything is ok
            }else{
                return 2; //Password failure
            }
        }
    }

}

?>
 
Аз поне нямам. Не мога да разбера тоя клас phpsession защо си го направил? :) Ползвай си php сесиите или тези на CI. Пробвай да го пренапишеш без phpsession класа. От там ти идват всичките главоболия според мен:)
 
най-вероятно ползваш нещо като това http://codeigniter.com/wiki/PHPSession/
Амо за какво ти е?
И в библиотека няма как да сложиш session_start(); най-отгоре
 
Galli каза:
най-вероятно ползваш нещо като това http://codeigniter.com/wiki/PHPSession/
Амо за какво ти е?
И в библиотека няма как да сложиш session_start(); най-отгоре
Да това ползвам :)
Но ако махна session_start() ми дава гешки:
Код:
A PHP Error was encountered

Severity: Notice

Message: Undefined variable: _SESSION

Filename: libraries/phpsession.php

Line Number: 48
Тоест не е стартирана сесията.
 
То си има session_start();, но в конструктора.
Най-добре е кажи защо искаш да ползваш тази библиотека, какви предимства има? Така някой може да те посъветва.
А аз съм почти убеден, че тя е писана доста преди да излезе последната версия на CI и неговата си библиотека е по-добра.
 
Не не е казано да се ползва тази библиотека. Въпросът е че четох, че за важни работи, не е добре да се ползва session-a на CI, защото той на практика е бизквитка, а не сесия. А и обикновенния session клас също не го подкарах от тези файлове. Нз защо.
 
Току що го пробвах при мен - работи.
Ти изобщо имаш ли някъде $this->load->library('phpsession');
И не прави промени по самия файл phpsession
 
Galli каза:
Току що го пробвах при мен - работи.
Ти изобщо имаш ли някъде $this->load->library('phpsession');
И не прави промени по самия файл phpsession

Направил съм го да се лоадва автоматично, и този модел и той се лоадва автоматично
 
Pavkatar каза:
Не не е казано да се ползва тази библиотека. Въпросът е че четох, че за важни работи, не е добре да се ползва session-a на CI, защото той на практика е бизквитка, а не сесия. А и обикновенния session клас също не го подкарах от тези файлове. Нз защо.
Ами използвай база данни за сесията и/или си включи криптиране на бисквитката
 
Оправих гоооо (party) :D
Трябваше да едитна библиотеката phpsession :)
Ето го кода ако на някой ако му трябва :)
Код:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Phpsession {
var $_flash = array();

    // constructor
    function  __construct() {
        session_start();
        $this->flashinit();
    }

    function save($var, $val, $namespace = 'default') {
        if ($var == null) {
            $_SESSION[$namespace] = $val;
        } else {
            $_SESSION[$var] = $val;
        }
    }

    function get($var = null, $namespace = 'default') {
        if($var != null)
            return isset($_SESSION[$var]) ? $_SESSION[$var] : null;
        else
            return isset($_SESSION[$namespace]) ? $_SESSION[$namespace] : null;
    }

    function clear($var = null, $namespace = 'default') {
        if((isset($var)) && ($var != null))
            unset($_SESSION[$var]);
        else
            unset($_SESSION[$namespace]);
    }

    function flashinit() {
        $this->_flash = $this->get(null, 'flash');
        $this->clear(null, 'flash');
    }

    function flashsave($var, $val) {
        $this->save($var, $val, 'flash');
    }

    function flashget($var) {
        if (isset($this->_flash[$var])) {
            return $this->_flash[$var];
        } else {
            return null;
        }
    }

    function flashkeep($var = null) {
        if ($var != null) {
            $this->flashsave($var, $this->flashget($var));
        } else {
            $this->save(null, $this->_flash, 'flash');
        }
    }
}
 
Видях, че си намерил решение на проблема си, но аз попаднах на този клас и реших да го споделя с теб http://codeigniter.com/wiki/Native_session/

system/application/libraries/native_session.php файлът си го копираш от там и го слагаш точно в папката, която са написали. И после:

$this->load->library('native_session');
$thid->native_session->тук можеш да ползваш всички функции от документацията на session класа :)
 

Back
Горе