2009-02-10 22 views
10

Kendi diziye oturumu veri session_encode() 'd dizesini unserialize istiyorum (yani değil $_SESSION için.)Oturum verilerini PHP'deki isteğe bağlı bir değişkene nasıl dönüştürebilirim?

bu işleyen bir dahili fonksiyon Orada görünmüyor. session_decode() var, ancak doğrudan süper $_SESSION yazıyor. unserialize() var, ancak biraz farklı bir biçim olduğundan session_encode() 'd dizeleri üzerinde false değerini döndürüyor.

Bunu yapmanın en iyi yolu nedir?

DÜZENLEME: PHP kılavuzun session_decode sayfasında yorumların dışında http://us.php.net/manual/en/function.session-decode.php#79244

cevap

7

kontrol edin: Bu benim gitti kodudur. session_encode dizgesini el ile çözmek için kullanılabilecek bir dizi kullanıcı işlevine sahiptir. Bildiğim kadarıyla, gitmenin tek yolu bu.

+0

Bu el kitabında ilk yanıtı kullandım. Bu cevaba doğrudan bir bağlantı eklemek için gönderimi düzenledim. –

+0

Gönderilen çözümler php.net'in ciddi bir kusuru olduğunu fark ettim. Düzenli bir ifadenin kullanılmasını engelleyen kendi çözümüme katkıda bulundum. Ben de burada yayınlayacağım. – Halcyon

-7

Neden böyle bir şey yapmıyorsunuz?

$myVariable = serialize($_SESSION); 
$sessionCopy = unserialize($myVariable); 

İyi şanslar!

+4

Oturumlar, serialize/unserialize() için farklı bir biçimde serileştirildiğinden() –

+0

Evet, ancak session.serialize_handler öğesini php_serialize olarak ayarlayabilirsiniz. Ayrıntılar için http://php.net/manual/session.configuration.php#ini.session.serialize-handler adresine bakın. – Greg

17

Oturumları el ile çözmek için gönderilen çözümlerin (php.net) mükemmel olmadığını fark ettim, bu yüzden daha sağlam bir çözüm sağladım.

Preg_match çözümü asla çalışmaz. Sıra dışıleşmeyi kıracak bir dava bulmak o kadar da zor değil. Benim çözüm bulabilirsiniz

$_SESSION["test"] = ";oops|"; 

: jason-joeymail durumunda üzerine kırılır. Düzenli bir ifade kullanmaz, serileştirme işleminin tersine çevrilebilirliği ve serileştirilen 'özellik', tamamlandığını düşündüğünde tüm diğer girdileri yok sayar. Bu hiçbir şekilde güzel ya da özellikle hızlı bir çözüm değildir, ancak daha sağlam bir çözümdür. "php" ve "php_binary" için bir desperizer ekledim. "Wddx" için bir tane eklemek önemsiz olmalı.

class Session { 
    public static function unserialize($session_data) { 
     $method = ini_get("session.serialize_handler"); 
     switch ($method) { 
      case "php": 
       return self::unserialize_php($session_data); 
       break; 
      case "php_binary": 
       return self::unserialize_phpbinary($session_data); 
       break; 
      default: 
       throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary"); 
     } 
    } 

    private static function unserialize_php($session_data) { 
     $return_data = array(); 
     $offset = 0; 
     while ($offset < strlen($session_data)) { 
      if (!strstr(substr($session_data, $offset), "|")) { 
       throw new Exception("invalid data, remaining: " . substr($session_data, $offset)); 
      } 
      $pos = strpos($session_data, "|", $offset); 
      $num = $pos - $offset; 
      $varname = substr($session_data, $offset, $num); 
      $offset += $num + 1; 
      $data = unserialize(substr($session_data, $offset)); 
      $return_data[$varname] = $data; 
      $offset += strlen(serialize($data)); 
     } 
     return $return_data; 
    } 

    private static function unserialize_phpbinary($session_data) { 
     $return_data = array(); 
     $offset = 0; 
     while ($offset < strlen($session_data)) { 
      $num = ord($session_data[$offset]); 
      $offset += 1; 
      $varname = substr($session_data, $offset, $num); 
      $offset += $num; 
      $data = unserialize(substr($session_data, $offset)); 
      $return_data[$varname] = $data; 
      $offset += strlen(serialize($data)); 
     } 
     return $return_data; 
    } 
} 

Kullanımı:

Session::unserialize(session_encode()); 
+0

+1 kodu biraz çirkin, fakat bu benim için çalışan diğer çözümlerdir. – Mahn

+0

Bu, oturum verilerini komut satırından ayrıştırmak isteyen herkes için yararlıdır, çünkü 'session_decode' yalnızca açık bir oturumunuz varsa çalışır. –

+1

Aşağıdakilere kıyasla herhangi bir kıyaslama var mı? '$ cur = session_encode(); session_decode ($ encoded_data);/* şifrelenmiş veriler $ _SESSION */session_decode ($ cur) içine koyulur;/* geçerli $ _SESSION geri yüklendi */' –

1

özel 'php' yukarıdaki kademeli olarak girdi oturumu dize kadar yeme lehine 'offset artırılmıyor' yaklaşımını kaçınarak temizleyici yapılabilir deserialise fonksiyonu.Ben hız açısından karşılaştırır, ama kesinlikle Sessizleştirme var nasıl kontrol ettik (ve while döngüsünde strlen çağrıları tekrarladı kaydeder) Bu benim için çalıştı

$r = array(); 
while ($i = strpos($str, '|')) 
{ 
    $k = substr($str, 0, $i); 
    $v = unserialize(substr($str, 1 + $i)); 
    $str = substr($str, 1 + $i + strlen(serialize($v))); 
    $r[$k] = $v; 
} 
return $r; // session data are now in a normal array 
+0

@Michael Szyndel: cevabım, özellikle" durum "ifadesinde özel bir değer olduğu için yukarıdaki 'php' işleyicisine atıfta bulundu. Gereksiz yere gönderiyi düzenlemek için" PHP deserialise .. " "Bu detay kayboldu. – itl

0

:

/* storre current session */ 
$current_session = session_encode(); 

/* extract $other_user_session from file or database, 
    into the $_SESSION global variable */ 
session_decode($other_user_session); 

/* use the other user session data: $something = $_SESSION['something']; */ 

/* restore previous sesison info */ 
session_decode($current_session); /* current $_SESSION restored */ 
0
function data_session_decode($data){ 
    $data = array_filter(explode(';',$data)); 
    $list_data = array(); 
    foreach($data as $key => $dat){ 
     if(!empty($dat)){ 
      $data[$key] = array_filter(explode('|',$dat)); 
      if(substr($data[$key][1], 0, 1) == 'i'){ 
       $list_data[$data[$key][0]] = strstr($data[$key][1], ':'); 
       $list_data[$data[$key][0]] = substr($list_data[$data[$key][0]], 1); 
      }elseif(substr($data[$key][1], 0, 1) == 's'){ 
       $list_data[$data[$key][0]] = strstr($data[$key][1], '"'); 
       $list_data[$data[$key][0]] = substr($list_data[$data[$key][0]], 0, -1); 
       $list_data[$data[$key][0]] = substr($list_data[$data[$key][0]], 1); 
      }else{ 
       unset($data[$key]); 
      } 
     } 
    } 
    unset($data); 
    return $list_data; 
} 

// BURADA VERİ OTURUM EX:

$ DataSession = 'user_name | s: 8: "Sen Ad"; tarih | i: 1459396063';

// Out

print_r ($ this-> data_session_decode ($ DataSession));

İlgili konular