2

だから、セッションをmysql dbに保存しようとしています。セッションテーブルなどにデータを書き込むという点で、すべてが順調に進んでいるようです。しかし、読み取りメソッドが空であるにもかかわらず、セッションデータを書き出すことができることに気付きました。したがって、コードを見ると、ロジックが定義されていなくても、最後の echo ステートメントは「値」を書き込みます。何か案は?ありがとう!

class SessionManagement{

    private $_hostname;
    private $_username;
    private $_password;
    private $_database;
    private $_timeout;

    public function __construct() {
        $CI =& get_instance();
        $CI->load->database();

        $this->_hostname = $CI->db->hostname;
        $this->_username = $CI->db->username;
        $this->_password = $CI->db->password;
        $this->_database = $CI->db->database;       
        $this->_timeout  = 60 * 60 * 10;    
    }

    public function _open()
    {
        return TRUE;
    }

    public function _close()
    {
        return TRUE;
    } 

    public function _read($id)
    {
                mysql_connect($this->_hostname, $this->_username, $this->_password);
    mysql_select_db($this->_database);

    $id = mysql_real_escape_string($id);

    $sql = "SELECT session_data
            FROM   sessions
            WHERE  session_id = '$id'";

    if ($result = mysql_query($sql)) {
        if (mysql_num_rows($result)) {
            $record = mysql_fetch_assoc($result);

            return $record['session_data'];
        }
    }

    return '';  
    }

    public function _write($id, $data)
    {

        mysql_connect($this->_hostname, $this->_username, $this->_password);
        mysql_select_db($this->_database);

        $id = mysql_real_escape_string($id);
        $data = mysql_real_escape_string(base64_encode(serialize(strip_tags($data))));  
        $access = time() + $this->_timeout;

        $sql = "REPLACE INTO session (session_id, session_data, session_expires) VALUES('$id','$data', $access)";

        return mysql_query($sql);
    }
    public function _gc($max)
    {
        return TRUE;
    }

    public function _destroy($id)
    {
        mysql_connect($this->_hostname, $this->_username, $this->_password);
        mysql_select_db($this->_database);

        $id = mysql_real_escape_string($id);

        $sql = "DELETE
                FROM   session
                WHERE  session_id = '$id'";

        return mysql_query($sql);
    }
}

ini_set("session.save_handler", "user");

session_name("test");
session_set_cookie_params(0, '/', '.test.com');

$s = new SessionManagement();

session_set_save_handler(
        array($s, '_open'),
        array($s, '_close'),
        array($s, '_read'),
        array($s, '_write'),
        array($s, '_destroy'),
        array($s, '_gc')
); 

session_start();

$_SESSION['test'] = "value";

ECHO $_SESSION['test'];
4

3 に答える 3

1

実際には、_write 関数ハンドラは、出力ストリームが閉じられるまで実行されません。

したがって、あなた$_SESSION['test'] = "value";は単なる配列なので、値を出力します。

詳細はこちら

于 2012-12-24T12:11:11.960 に答える