PHP Depolama Oturumlar: Session değişkenleri dizgeleştirir gibi olamaz

5 Cevap php

Ben seralize yararlanarak ve set ve benim veritabanından oturum değişkenlerini almak için unseralize duyuyorum.

Bir kullanıcı bir oturumda ve onlar tıklayın her zaman kaydedebilirsiniz. Ben bunu:

$array = serialize($_SESSION);
//and save to DB field

Bir kullanıcı oturumu yüklediğinde, bu yüzden gibi o oturuma devam etmek için çok değişkenleri yükleyin:

//get row from DB
$_SESSION = unserialize($row['session_variables']);
  1. Bu benim için çalışmıyor. : Böyle bir şey verir gibi zaman print_r($_SESSION) Bu öncelikle unseralize değil

    Array (
        [user_id] => test2
        [date_created] =>
        [date_updated] =>
        [session_variables] => a:9:{s:7:"user_id";s:5:"test2";s:12:"date_created";N;s:12:"date_updated";N;s:17:"session_variables";s:149:"a:6:{s:7:"user_id";s:5:"test2";s:4:"here";s:2:"12";s:5:"here2";s:6:"112432";s:5:"here3";s:6:"132432";s:5:"here4";s:4:"1qw2";s:5:"here5";s:5:"1wqe2";}";s:4:"here";s:2:"12";s:5:"here2";s:6:"112432";s:5:"here3";s:6:"132432";s:5:"here4";s:4:"1qw2";s:5:"here5";s:5:"1wqe2";}
        [here] => 12
        [here2] => 112432
        [here3] => 132432
        [here4] => 1qw2
        [here5] => 1wqe2
    )
    
  2. Nerede bu değişkenler için session_id farklı sayfalar arasında kullanılabilir mi? Ben onları yazdım?

Herhangi bir yardım için teşekkür ederiz

EDIT

Session_id global $ _SESSION tutulur? Ben tahmin ediyorum. Ben $ _SESSION unset ise, oturum sadece değişkenleri, doğru gitmiş olmayacak anlamına gelir? Herkes lütfen doğrulamak?

5 Cevap

Bu deneyin.

$array = base64_encode(serialize($_SESSION)); // going to the database
$_SESSION = unserialize(base64_decode($row['session_vars'])); // coming from the database

Bunu base64_encode sürece çoğu kez MySQL seri hale getirilmiş verileri ile oynamak güzel olmaz. Görmek eğer yardımcı olur.

Bu konuda yanlış yoldasın. Elle almaya çalışırken ile tekerleği yeniden icat etmeyin -> serialize ve unserialize -> oturum verilerini ayarlayın

Bunun yerine, sizin için veritabanı işi yapacak yeni bir oturum işleyicisi oluşturun. Serileştirme / unserializtion de sizin için işlenir - açıkça bu işlevleri çağırmak zorunda kalmazsınız. Ayrıca, bu işlem için kurulmuş mekanizmasını kullanarak değil, sen (oturumun çöp toplayıcısı gibi) bazı işlevleri üzerinde eksik konum

Ama bundan önce, bizim oturum depolama olarak hareket edeceğini adlı bir veritabanı tablosu yapalım

CREATE  TABLE IF NOT EXISTS `user_session` (
  `user_session_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `sess_id` VARCHAR(64) NOT NULL ,
  `sess_data` TEXT NOT NULL ,
  `sess_time` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`user_session_id`) ,
  INDEX `idx_sess_id` (`sess_id` ASC) ,
  INDEX `idx_sess_time` (`sess_time` ASC) )
ENGINE = InnoDB;

Sonraki ihtiyacımız yöntemleri ile bir sınıf yapmaktır. Ben hepsini doldurmak için gitmiyorum - bu sizin için bir egzersiz var ;)

class MysqlSessionHandler
{
  protected $db;

  public function __construct( $db )
  {
    $this->db = $db
  }

  public function open()
  {

  } 

  public function close()
  {

  }

  public function read()
  {

  }

  public function write()
  {

  }

  public function destroy()
  {

  }

  public function gc()
  {

  }

  public function register()
  {
    return session_set_save_handler(
        array( $this, 'open' )
      , array( $this, 'close' )
      , array( $this, 'read' )
      , array( $this, 'write' )
      , array( $this, 'destroy' )
      , array( $this, 'gc' )
    );
  }
}

Ve temel kullanım olacaktır

$sessionHandler = new MysqlSessionHandler( $db );
$sessionHandler->register();

Ve son bir not olarak, her zaman sadece çağırarak geçerli oturum kimliği alabilirsiniz session_id()

PHP oturumları için serileştirme kendi özel bir tür yapar ve bu serileştirme yerde oluyor gibi görünüyor. Ben tüm kodu erişimi yok, bu yüzden gerçekten nerede söyleyemem. : Eğer debug çıktısını eklerseniz

-Ne verileri serialize önce benziyor

Verileri serialize sonra gibi görünüyor-ne

-Ne verileri DB içine taktığınızda gibi görünüyor

-Ne verileri DB onu getir zaman gibi görünüyor

Verileri unserialize hemen sonra gibi görünüyor-ne.

Bu PHP'nin serileştirme inşa sorunlara neden olduğu teşhis için yeterli bilgisi olmalıdır.

Oturum işleme "sadece" inşaat ki PHP sihirli şeylerden biridir. Eğer yerine yeni oturum işleyicisi oluşturmak gerekir dosya sistemini kullanan bir db oturumları saklamak gerekir.

Ben dönerken 2003 yılında gelen Jon Parise postgres oturumu işleyici eski portunu kullanarak oldum!

Zend bu buldu. Daha güncel bilgi gibi görünüyor.

http://devzone.zend.com/article/141

Kısacası, sadece veritabanına verileri zorlayarak ve kendi serialize malzeme ile alınırken kesmeyecek. Bunu her yerde çalışmak için gidiyor bilmek tam oturum yöneticisinin yapmak nee.

Eğer $ _SESSION küresel serialize zaman söz konusu oturumun kimliği yakalamak değil. Ben kullanmanız gerekir eminim

$session_id = session_id();

ve el ile kaydedin.

PHP Manual: http://php.net/manual/en/function.session-id.php