Php serialize () ve unserialize () nasıl kullanılır


125

Benim sorunum çok basit.

Ben tam olarak ne şekilde benim ihtiyaçlarını karşılamak için herhangi bir örnek bulamadık serialize()ve unserialize()ortalama php? Sadece bir örnek verirler - bir diziyi serileştirir ve açıklanamayan bir biçimde bir çıktıyı gösterirler. Onların jargonundan geçen temel kavramı anlamak gerçekten zor.

DÜZENLE:

<?php

$a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3');
print_r($a);
echo ("<br></br>");
$b=serialize($a);
print_r($b);

?>

çıktı:

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

İkinci çıktıyı anlayamıyorum. Bunun yanı sıra, kullanmadan önce bir php dizisini serileştirmem gereken bir duruma örnek verebilir mi?


10
"İkincil çıktı" hakkında hala merak ettiyseniz, oldukça basit: a = dizi, 3 = {} 'ler içindeki üç öğenin boyutu. bunun içinde, i = tamsayı / indeks 1'e eşit, uzunluk 6'nın "elem 1" dizesi, 2'ye eşit tam sayı ... vb. var. Bu şekilde okuduğunuzda oldukça açık. Birden fazla dizi / nesne seviyesinin içinde kolayca yer aldığını hayal edebilirsiniz, ancak değişiklik çok akıllıca değildir, tutarlılığı sağlamak için gerçekten seri hale getirip değiştirip ardından serileştirmelisiniz.
Grizly

2
@IstiaqueAhmed, "kullanmadan önce bir php dizisini serileştirmem gereken bir duruma örnek verebilir mi" , stackoverflow.com/a/30436890/632951
Pacerier

@grizly teşekkürler dostum, iki yıldır böyle bir cevap arıyordum, bunu nasıl açıklayacağımı veya bu özelliği kullanma nedenini nasıl ilişkilendireceğimi bilmiyordum, cevabın için teşekkürler
isaacewing

Yanıtlar:


169

Bir PHP dizisi veya nesnesi veya diğer karmaşık veri yapısı , çalışan bir PHP betiğinin dışında taşınamaz veya depolanamaz veya başka şekilde kullanılamaz . İsterseniz devam bir komut dosyası tek vadede ötesinde böyle karmaşık veri yapısını yapmanız gerekenler seri onu. Bu, yapıyı, veritabanları, metin dosyaları, soketler gibi PHP dışındaki şeyler tarafından işlenebilecek "daha düşük bir ortak payda" içine koymak anlamına gelir. Standart PHP işlevi serialize, böyle bir şeyi ifade etmek için sadece bir biçimdir , bir veri yapısını PHP'ye özgü bir dizge temsiline serileştirir ve kullanılarak bir PHP nesnesine ters çevrilebilir unserialize. Yine de JSON veya XML gibi birçok başka format vardır.


Örneğin şu yaygın sorunu ele alalım:

Bir PHP dizisini Javascript'e nasıl geçiririm?

PHP ve Javascript yalnızca dizeler aracılığıyla iletişim kurabilir. Dizeyi "foo"çok kolay bir şekilde Javascript'e iletebilirsiniz . Numarayı 1çok kolay bir şekilde Javascript'e iletebilirsiniz . Boole değerlerini trueve falsekolaylıkla Javascript'e aktarabilirsiniz . Ama bu diziyi Javascript'e nasıl geçirirsiniz?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

Cevap serileştirmedir . PHP / Javascript söz konusu olduğunda, JSON aslında daha iyi serileştirme formatıdır:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }

Javascript, bunu kolaylıkla gerçek bir Javascript dizisine çevirebilir.

Bu, aynı veri yapısının bir temsilidir, ancak:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

Ancak hemen hemen sadece PHP bunu kullanır, bu format için başka hiçbir yerde çok az destek vardır.
Bu çok yaygındır ve iyi desteklenir:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>

Karmaşık veri yapılarını dizeler halinde geçirmeniz gereken birçok durum vardır . Diziler olarak rastgele veri yapılarını temsil eden serileştirme, bunun nasıl yapılacağını çözer.


1
Açıklamanız beklediğim şeye yaklaşıyor gibi görünüyor. lütfen benim düzenlememe bir göz atabilir misin?
Istiaque Ahmed

1
a: 3: {i: 1; s: 6: "elem 1"; i: 2; s: 6: "elem 2"; i: 3; s: içindeki a, i, s vb. 7: "elem 3";}? Ve eğer sakıncası yoksa, diziyi js'ye göndermek için (bu yazının temasıyla alakalı olmayabilir) bir örnek.
Istiaque Ahmed

2
Bildiğim kadarıyla bu formatın neredeyse resmi bir özelliği bulunmuyor, ama tahmin edebilirsiniz, değil mi? i:1= tamsayı 1, s:6:"elem 1"= 6 karakterli dizge "elem 1" ... Peki hangi örneği bekliyorsunuz, ben verdim sanıyordum?
deceze

"Ama bu diziyi Javascript'e nasıl iletirsiniz? Array ([1] => elem 1 [2] => elem 2 [3] => elem 3)" ... sadece tam kod parçacığı
Istiaque Ahmed

echo json_encode($array);Nasıl tam olarak size geçmesi o şartlara bağlıdır. Buna fazla takılma.
deceze

27

PHP serialize () unserialize () kullanımı

http://freeonlinetools24.com/serialize

echo '<pre>';
// say you have an array something like this 
$multidimentional_array= array(
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 4, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 5, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 8, 7) 
    )
);

// serialize 
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);

Bu size bunun gibi bir çıktı verir

a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}

yine orijinal diziyi geri almak istiyorsanız PHP unserialize () işlevini kullanın

$original_array=unserialize($serialized_array);
var_export($original_array);

Umarım bu yardımcı olacak


7

Php değerinizi depolanabilir yapmak istediğinizde, onu bir dizge değeri haline getirmelisiniz, serialize () bunu yapar. Ve unserialize () ters şeyi yapar.


1
'depolanabilir' ne anlama geliyor? Bahsettiğin sayfayı inceledim. php ve mysql'de bir örnek gösterebilir misiniz (gerekirse)?
Istiaque Ahmed

2
@Istiaque Ahmed Örneğin, bir diziyi diskteki bir dosyaya depolamak istediğinizde, diziyi doğrudan kaydedemezsiniz, ancak onu saklanabilir bir değere çevirirsiniz ve bu bir dizedir.
xdazz

ancak bir değişkeni php mysql'de serileştirmeden veritabanına doğrudan ekleyebiliriz. açıklama lütfen.
Istiaque Ahmed

9
"Veritabanına bir değişkeni serileştirmeden ekleyebiliriz" . Bu yalnızca temel veri türleri (dizeler, tam sayılar, sayılar) için geçerlidir. Dizileri ve nesneleri doğrudan DB veya dosya sistemine ekleyemeyiz . Yani ne serialize()ve unserialize()için yapılır.
lorenzo-s

Bazı bilgileri alırsınız ve bir yere saklamaya / göndermeye hazır olarak php betiğinizde onunla bazı işler yaparsınız. Beklenen verilerle tam olarak eşleşen bir tablo oluşturma seçeneğiniz vardır, ancak bu sıkıcıdır çünkü iş yükünüzü ikiye katlarsınız çünkü aynı zamanda eşleşen kod yazmanız gerekir, ayrıca veritabanındaki değişiklikler kodda değişiklik gerektirir veya tam tersi. Serileştirildiğinde, iki sütun id int (10) ve BLOB bilgisi içeren bir tablo oluşturabilirsiniz. Serialise, size eklemek için bir dize verir ve serileştirme, verileri orijinal durumuna döndürür. Olmayacağı durumlar var, php dokümanları bunları kapsıyor.
Chris

7
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Bu programı çalıştırın, çıktıyı yansıtır

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}


burada
a = dizi boyutu
i = dizi numarasının sayısı
s = dizi değerlerinin boyutu

veri dizisini veri tabanında depolamak için serileştirmeyi kullanabilir ve kullanmak için verileri
alabilir ve UN-serileştirebilirsiniz.


6

Çoğu depolama ortamı dizi türlerini depolayabilir . Bir dizi veya nesne gibi bir PHP veri yapısını doğrudan depolayamazlar ve veri depolama ortamını PHP ile birleştireceği için yapmamaları gerekir.

Bunun yerine, serialize()bu yapılardan birini bir dizge olarak saklamanıza izin verir. İle dizge gösteriminden serileştirilebilir unserialize().

Eğer aşina değilseniz json_encode()ve json_decode()(genel olarak ve JSON), kavram benzer.


json ile aşina. hala php şeyinde belirsizlik. gönderimi düzenledi
Istiaque Ahmed

Bir json_encode varsa neden serileştirmeye ihtiyaç duyulur? Lütfen biliyorsanız açıklayın. Teşekkürler.
Yevgeniy Afanasyev

1
@YevgeniyAfanasyev Belki bazı veri alt kümeleri için değilsiniz. Ama sanırım serialize()JSON'dan önce.
alex

5

Lütfen! Lütfen! Lütfen! Verileri serileştirmeyin ve veritabanınıza yerleştirmeyin. Serileştirme bu şekilde kullanılabilir, ancak bu, ilişkisel bir veritabanının noktasını ve veritabanı motorunuzun doğasında bulunan veri türlerini eksiktir. Bunu yapmak, veritabanınızdaki verileri taşınamaz hale getirir, okumayı zorlaştırır ve sorguları karmaşıklaştırabilir. Uygulamanızın diğer dillere taşınabilir olmasını istiyorsanız, diyelim ki uygulamanızın Java'yı kullanmanın mantıklı olduğu bir kısmı için Java kullanmak istediğinizi anladığınızı fark ederseniz, serileştirme kalça ağrısı haline gelecektir. Eklenecek verileri değiştirmek için üçüncü taraf bir aracı araç kullanmadan her zaman veritabanındaki verileri sorgulayabilmeli ve değiştirebilmelisiniz.

kodun, taşınabilirlik sorunları olan kodun ve diğer RDMS sistemlerine, yeni şemaya vb. taşınması daha zor olan verilerin bakımını gerçekten zorlaştırır. Ayrıca, veritabanınızda aşağıdakilerden birine dayalı olarak arama yapmayı karmaşık hale getirme dezavantajına sahiptir. serileştirdiğiniz alanlar.

Bu serialize () işlevinin işe yaramaz olduğu anlamına gelmez. Değil ... Kullanmak için iyi bir yer, örneğin veri yoğun bir işlemin sonucunu içeren bir önbellek dosyası olabilir. Bir sürü başkası var ... Sadece serileştirmeyi kötüye kullanma çünkü bir sonraki kişi bir bakım veya göç kabusu yaşayacak.

İyi bir serialize () ve unserialize () örneği şu şekilde olabilir:

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");

Sayfada seriyi iptal et

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}

2
Sağlanan kod çeşitli güvenlik açığı içerir, gelen kişiler ve kodu kopyalayıp yapıştırma konusunda uyarılmalıdır.
Daniel W.

Verilen kod, searilize ve unserialize fonksiyonunun nasıl kullanılacağına dair sadece bir örnektir.
Avnish alok

2

Gönderen http://php.net/manual/en/function.serialize.php :

Bir değerin saklanabilir bir temsilini oluşturur. Bu, PHP değerlerini türlerini ve yapılarını kaybetmeden saklamak veya iletmek için kullanışlıdır.

Esasen, bir php dizisi veya nesnesi alır ve onu bir dizeye dönüştürür (daha sonra uygun gördüğünüz şekilde iletebilir veya saklayabilirsiniz).

Unserialize, dizeyi bir nesneye geri dönüştürmek için kullanılır.


'saklanabilir temsil'in açıklaması nedir?
Istiaque Ahmed

Birisi bir php dizisini alıp bir veritabanında depolamak istediğinde sadece serialize edildiğini gördüm. Seri hale getirebilir, çıktıyı veritabanınızdaki standart bir dize alanında depolayabilir ve ardından tekrar kullanmak istediğinizde yakalayabilir ve serileştirebilirsiniz.
MrGlass

1

Temel olarak, dizileri veya nesneleri serileştirdiğinizde, onları basitçe geçerli bir dizge biçimine çevirirsiniz, böylece onları php betiğinin dışında kolayca saklayabilirsiniz.

  1. Bir nesnenin durumunu veritabanına kaydetmek için serileştirmeyi kullanın (örnek olarak Kullanıcı sınıfını alalım) Daha sonra, önceki durumu nesneye geri yüklemek için verileri serileştirmeyin (yöntemler serileştirici değildir, kullanabilmek için nesne sınıfını eklemeniz gerekir o)
    • kullanıcı kişiselleştirme

Nesne için sihirli __sleep ve __wakeup yöntemlerini kullanmalısınız. __sleep serialize () tarafından çağrılır. Bir uyku yöntemi, kalıcı olmasını istediğiniz nesneden bir dizi değer döndürür.

__wakeup unserialize () tarafından çağrılır. Bir uyandırma yöntemi serileştirilmemiş değerleri almalı ve bunları nesnede bunlarda başlatmalıdır.

Php ve js arasında veri iletmek için, php dizisini geçerli json biçimine çevirmek için json_encode kullanırsınız. Veya tam tersi - bir çıktı verilerini (dizeyi) geçerli json nesnesine dönüştürmek için JSON.parese () kullanın. Yerel depolamadan yararlanmak için bunu yapmak istersiniz. (çevrimdışı veri erişimi)


Bir json_encode varsa neden serileştirmeye ihtiyaç duyulur? Lütfen biliyorsanız açıklayın. Teşekkürler.
Yevgeniy Afanasyev

1
Seri hale getirme ve serileştirme özelliğini kullanırken harmanlanan sihirli yöntemi özelleştirebilmenin avantajlarından yararlanabilirsiniz. Bununla birlikte, Json_encode () ve json_decode () çok daha fazlasını alabileceğinizi ve her nesnenin bu işlevleri benzersiz bir şekilde işleyebileceğini söyledi. Bu yüzden onları kullanmak istiyorsunuz.
DevWL

1
Daha fazlası var. Daha fazla bilgi için bu yanıta bakın stackoverflow.com/questions/804045/…
DevWL

1
json_encode daha hızlıdır (kullandığınız PHP sürümüne bağlıdır), json, stdClass olarak kod çözer, serilize edilmiş nesne gerçek Sınıf örneği olarak serileştirilmez, Bazı yapılandırmalar UTF-8 kodlamasını değiştirmeden korumak için JSON'a yapılmıştır, serileştirme kodlamayı değiştirmez. Veri çapraz platformunun JSON kullanmasını istiyorsanız, sadece PHP'de çalışıyorsanız, serileştirmeyi özelleştirmek için __sleep ve __wakeup sihirli yöntemini kullanabilirsiniz.
DevWL

0

Evet yapabilirim. Sisteminizi izlememiz gerektiğini varsayalım, sisteminizde birden fazla yönetici ve alt yönetici vardır, Bunların tümü herhangi bir bilgiyi ekleyebilir veya güncelleyebilir veya düzenleyebilir. Daha sonra bu değişikliği kimin yaptığını bilmeniz gerekir. Bu sorunu çözmek için serileştirmeniz gerekir.

  **Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:

  history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)

Umarım bu sana yardımcı olmuştur.


-1
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.