php oturumda nesneleri saklamak

5 Cevap php

PHP belgelerine "başka bir değişkene başvuru geri kılmanın bir yolu var gibi oturum değişkenleri başvurular kullanamazsınız" diyor.

Bu gibi şeyler olamaz anlamına gelmez:

session_start();
$user =new User;
$user->name='blah';
$_SESSION['user']=$user;

Ben basit bir dize saklamak için denedim ve oturuma bir kullanıcı bir nesne, dize her zaman sayfalara sayfalar arasında devam ederse, veya sayfa yenilendikten sonra. Ancak kullanıcı değişkeni $ _SESSION (boş olur) kaybolur.

Herhangi bir fikir?

Edit: I have confirmed that session_id is the same in all of these pages/subpages,before & after page refresh.

Edit: Strangely, after I tried serialize and unserialize approach below, the serialized user object(or string) in session still still disappears!

Edit: finally I figured out what the bug was, looks like somehow $_SESSION['user'] gets overwritten by some mysterious force, if I use any variable other than 'user', then everything's fine. PHP(at least 5.3 which is the version I'm using) does serialize and unserialize automatically when you put object in the $_SESSION.

session_start();
$user=new User();
$user->name='blah'
$_SESSION['myuser']=$user; 

5 Cevap

PHP 5 Gayrimenkul için magic __sleep and __wakeup methods kullanmanız gerekir.

Aşağıdaki kod bloğu Örneğin:

$obj = new Object();

$_SESSION['obj'] = serialize($obj);

$obj = unserialize($_SESSION['obj']);

__sleep) serialize (denir. Bir uyku yöntem devam etmek istediğiniz nesneden değerler dizisi dönecektir.

__wakeup unserialize () denir. Bir uyandırma yöntemi dizgilenmemiş değerleri alır ve nesne onlara bunları başlatmak gerekir.

Dokümantasyon atıfta gibi kod örneği başvurularını kullanarak değildir. This is what php means by references:

$var =& $GLOBALS["var"];

Oturumuna nesneleri koyarak gibi, PHP can mağaza nesneler $_SESSION. Bkz http://example.preinheimer.com/sessobj.php.

What you are seeing is a bug __sleep ve __destruct çağrıları için (__destruct __sleep önce denir ediliyor) ve oturum modülünün kapatma sırasında nesne seri hale getirmek için başarısız olur. Bu hata 1 Eylül 2009 tarihinde açıldı.

Bu beklenen bir davranış. Nesnesi için bellek yeri değişmedi varsa bir nesneye bir başvuru saklanması sadece çalışmak istiyorum. HTTP gibi vatansız protokolde, uygulama devlet istekleri arasında kalıcı değildir. Sonraki istek başka bir iş parçacığı, işlem veya başka bir sunucu üzerinde işlenebilir.

Bir web uygulamasının doğasında vatansız doğa, bir hafıza konumuna bir işaretçi tutan verilen işe yaramaz. Bu nedenle nesnenin durumu, depolama biçime kırılmış kaydedilir veya iletilir ve daha sonra gerektiğinde yeniden gerekir. Bu işlem, Serialization olarak bilinir.

Sen oturumuna tüm nesneyi serialize seçebilirsiniz (hangi belki tehlikeli nesne diğer nesnelere başvurular tutabilir ve bu da tefrika edilmesi gerekir çünkü, nesne grafik derinliğine bağlı olarak), veya nesne yeniden olabilir eğer sonraki istek üzerine veritabanını sorgulayarak sadece oturumda bir kimliği saklamak olabilir.

[EDIT]

JPot yüzden açık serileştirme gerekli değildir, nesneleri otomatik olarak $ _SESSION serileştirilebilir dikkat çekti. Ben kuşaklar için cevap bırakacağım, ama belli ki bu sorunu yardımcı olmuyor.

You were right saying you can not store references in sessions variables assigning an object in PHP 5 and above is doing just that assigning the reference not the obj

Bu onun size (Class da __ uyku uygulanması) ve bir oturum değişkeni dize atayarak nesne seri hale getirmek gerekir neden

ve daha sonra serisi kaldırılırken daha sonra oturum değişkeni (__ uyandırma Sınıfı de uygulanması).

Bu php.net tarif ne gibi geliyor.

Ben aynı sorunları geldi ve bu başkası için yararlı olabilir umuyoruz.

Read the second contribution post ;)