Cara menggunakan php serialize () dan unserialize ()

125

Masalah saya sangat mendasar.

Saya tidak menemukan contoh untuk memenuhi kebutuhan saya seperti apa sebenarnya serialize()dan unserialize()maksudnya di php? Mereka hanya memberikan contoh - membuat serial array dan menampilkan output dalam format yang tidak dapat dijelaskan. Sangat sulit untuk memahami konsep dasar melalui jargon mereka.

EDIT:

<?php

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

?>

keluaran:

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";}

Saya tidak dapat memahami hasil kedua. Selain itu, adakah yang bisa memberikan contoh situasi yang saya perlukan untuk membuat serial array php sebelum menggunakannya?

Istiaque Ahmed
sumber
10
Jika Anda masih penasaran tentang "keluaran sekunder", ini cukup sederhana: a = larik, 3 = ukuran tiga elemen dalam {}. Di dalamnya, Anda memiliki i = integer / index sama dengan 1, string len 6 sama dengan "elem 1", integer sama dengan 2 .. dll dll .. Cukup jelas jika Anda membacanya seperti itu. Anda dapat membayangkan beberapa level array / objek dengan mudah dimuat di dalamnya, namun modifikasi sangat tidak bijaksana, Anda harus benar-benar membatalkan serialisasi kemudian membuat serial untuk memastikan konsistensi.
Grizly
2
@IstiaqueAhmed, Mengenai "siapa saja dapat memberikan contoh situasi yang saya perlukan untuk membuat serial array php sebelum menggunakannya" , ada contoh seperti itu di stackoverflow.com/a/30436890/632951
Pacerier
@grizly thanks man, Saya sudah mencari jawaban seperti itu selama dua tahun, saya tidak tahu bagaimana menjelaskannya atau bagaimana mengaitkan alasan menggunakan fitur itu, terima kasih atas jawabannya
isaacewing

Jawaban:

169

Array atau objek PHP atau struktur data kompleks lainnya tidak dapat dipindahkan atau disimpan atau digunakan di luar skrip PHP yang sedang berjalan . Jika Anda ingin mempertahankan struktur data yang kompleks di luar satu skrip yang dijalankan, Anda perlu membuat serialnya . Itu hanya berarti meletakkan struktur ke dalam "penyebut umum yang lebih rendah" yang dapat ditangani oleh hal-hal selain PHP, seperti database, file teks, soket. Fungsi PHP standar serializehanyalah format untuk mengekspresikan hal seperti itu, ia membuat struktur data menjadi representasi string yang unik untuk PHP dan dapat dibalik menjadi objek PHP menggunakan unserialize. Ada banyak format lain, seperti JSON atau XML.


Ambil contoh masalah umum ini:

Bagaimana cara meneruskan array PHP ke Javascript?

PHP dan Javascript hanya dapat berkomunikasi melalui string. Anda dapat meneruskan string "foo"dengan sangat mudah ke Javascript. Anda dapat memberikan nomor tersebut 1dengan sangat mudah ke Javascript. Anda dapat meneruskan nilai boolean truedan falsedengan mudah ke Javascript. Tapi bagaimana Anda meneruskan array ini ke Javascript?

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

Jawabannya adalah serialisasi . Dalam kasus PHP / Javascript, JSON sebenarnya adalah format serialisasi yang lebih baik:

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

Javascript dapat dengan mudah membalikkan ini menjadi array Javascript yang sebenarnya.

Ini sama validnya dengan representasi dari struktur data yang sama:

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

Tetapi cukup banyak hanya PHP yang menggunakannya, ada sedikit dukungan untuk format ini di tempat lain.
Ini sangat umum dan juga didukung dengan baik:

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

Ada banyak situasi di mana Anda perlu meneruskan struktur data kompleks sebagai string. Serialisasi, merepresentasikan struktur data arbitrer sebagai string, memecahkan cara melakukannya.

menipu
sumber
1
Penjelasan Anda tampaknya mendekati apa yang saya harapkan. bisakah kamu melihat suntingan saya?
Istiaque Ahmed
1
apa penjelasan dari mereka a, i, s dll di a: 3: {i: 1; s: 6: "elem 1"; i: 2; s: 6: "elem 2"; i: 3; s: 7: "elem 3";}? Dan jika Anda tidak keberatan, contoh serialisasi array (mungkin tidak relevan dengan tema posting ini) untuk dikirim ke js.
Istiaque Ahmed
2
Sejauh yang saya tahu, hampir tidak ada spesifikasi formal dari format itu yang dapat ditemukan, tetapi Anda dapat menebaknya, bukan? i:1= integer 1, s:6:"elem 1"= string dengan 6 karakter "elem 1" ... Dan contoh apa yang Anda minta, saya pikir saya berikan satu?
menipu
"Tapi bagaimana Anda meneruskan larik ini ke Javascript? Array ([1] => elem 1 [2] => elem 2 [3] => elem 3)" ... hanya cuplikan kode yang tepat untuk itu
Istiaque Ahmed
echo json_encode($array);Bagaimana tepatnya Anda lulus tergantung pada keadaan. Jangan terlalu terpaku pada itu.
menipu
27

Penggunaan PHP serialize () unserialize ()

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);

Yang memberi Anda keluaran seperti ini

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;}}}

sekali lagi jika Anda ingin mendapatkan kembali array asli cukup gunakan fungsi PHP unserialize ()

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

Saya harap ini akan membantu

tipico
sumber
7

Ketika Anda ingin membuat nilai php Anda dapat disimpan, Anda harus mengubahnya menjadi nilai string, itulah yang dilakukan serialize () . Dan unserialize () melakukan hal sebaliknya.

xdazz
sumber
1
'dapat disimpan' apa artinya? Saya telah melalui halaman yang Anda rujuk. bisakah kamu menunjukkan contoh di php, dan mysql (jika perlu)?
Istiaque Ahmed
2
@Istiaque Ahmed Misalnya, saat Anda ingin menyimpan array ke file di disk, Anda tidak dapat menyimpan array secara langsung tetapi mengubahnya ke nilai yang dapat disimpan dan itu adalah string.
xdazz
tetapi kita bisa langsung memasukkan variabel ke dalam database tanpa membuat serialisasi di php mysql. tolong penjelasannya.
Istiaque Ahmed
9
"Kami dapat memasukkan variabel ke dalam database tanpa membuat serialisasi" . Ini berlaku hanya untuk tipe data fundamental (string, integer, angka). Kami tidak dapat memasukkan array dan objek secara langsung ke dalam DB atau sistem file. Untuk itulah serialize()dan unserialize()dibuat.
lorenzo-s
Anda mengambil beberapa informasi dan melakukan beberapa pekerjaan dengannya di skrip php Anda siap untuk menyimpan / mengirimkannya ke suatu tempat. Anda memiliki opsi untuk membuat tabel yang sama persis dengan data yang diharapkan, tetapi ini membosankan Anda pada dasarnya menggandakan beban kerja Anda karena Anda harus menulis kode yang cocok juga, ditambah perubahan dalam database perlu perubahan kode atau sebaliknya. Ketika serialisasi Anda cukup membuat tabel dengan dua kolom id int (10) dan informasi BLOB. Serialise memberi Anda string untuk disisipkan dan unserialize mengembalikan data ke keadaan semula. Ada beberapa kasus yang tidak biasa, dokumen php mencakupnya.
Chris
7
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Jalankan program ini dengan output echo

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


di sini
a = ukuran larik
i = jumlah bilangan larik
s = ukuran nilai larik

Anda dapat menggunakan serialize untuk menyimpan array data dalam database
dan dapat mengambil dan UN-serialize data untuk digunakan.

Manikandan
sumber
6

Sebagian besar media penyimpanan dapat menyimpan jenis string . Mereka tidak dapat secara langsung menyimpan struktur data PHP seperti array atau objek, dan mereka tidak boleh, karena itu akan memasangkan media penyimpanan data dengan PHP.

Sebaliknya, serialize()memungkinkan Anda untuk menyimpan salah satu dari struct ini sebagai string. Ini dapat dide-serialisasi dari representasi stringnya dengan unserialize().

Jika Anda sudah familiar dengan json_encode()dan json_decode()(dan JSON secara umum), konsepnya serupa.

alex
sumber
akrab dengan json. masih ketidakjelasan dalam hal php. mengedit posting saya
Istiaque Ahmed
Mengapa seseorang perlu membuat serial jika ada json_encode? Tolong jelaskan jika Anda tahu. Terima kasih.
Yevgeniy Afanasyev
1
@YevgeniyAfanasyev Mungkin Anda tidak menyukai beberapa subkumpulan data. Tapi saya pikir lebih serialize()dulu dari JSON.
alex
5

Silahkan! silahkan! silahkan! JANGAN membuat serial data dan menempatkannya ke dalam database Anda. Serialize dapat digunakan seperti itu, tetapi itu kehilangan inti dari database relasional dan tipe data yang melekat di mesin database Anda. Melakukan hal ini membuat data di database Anda menjadi non-portabel, sulit dibaca, dan dapat mempersulit kueri. Jika Anda ingin aplikasi Anda portabel ke bahasa lain, seperti katakanlah Anda ingin menggunakan Java untuk beberapa bagian dari aplikasi Anda yang masuk akal untuk menggunakan Java, serialisasi akan menjadi masalah di pantat. Anda harus selalu dapat membuat kueri dan mengubah data dalam database tanpa menggunakan alat perantara pihak ketiga untuk memanipulasi data yang akan disisipkan.

itu membuat sangat sulit untuk memelihara kode, kode dengan masalah portabilitas, dan data yang lebih sulit untuk bermigrasi ke sistem RDMS lain, skema baru, dll. Ini juga memiliki kerugian tambahan yaitu membuatnya berantakan untuk mencari database Anda berdasarkan salah satu bidang yang Anda serialisasi.

Itu tidak berarti serialize () tidak berguna. Ini bukan ... Tempat yang baik untuk menggunakannya mungkin file cache yang berisi hasil dari operasi intensif data, misalnya. Ada banyak lagi ... Hanya saja jangan menyalahgunakan serialisasi karena orang berikutnya yang datang akan mengalami mimpi buruk pemeliharaan atau migrasi.

Contoh yang baik dari serialize () dan unserialize () bisa seperti ini:

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

Batalkan serial di halaman

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}
Avnish alok
sumber
2
Kode yang diberikan mengandung beberapa kerentanan keamanan, orang yang datang dan menyalin kode harus diperingatkan.
Daniel W.
Kode yang diberikan hanyalah sebuah contoh bagaimana menggunakan fungsi searilize dan unserialize.
Avnish alok
2

Dari http://php.net/manual/en/function.serialize.php :

Menghasilkan representasi nilai yang dapat disimpan. Ini berguna untuk menyimpan atau meneruskan nilai PHP tanpa kehilangan jenis dan strukturnya.

Pada dasarnya, ini mengambil array atau objek php dan mengubahnya menjadi string (yang kemudian dapat Anda kirimkan atau simpan sesuai keinginan Anda).

Unserialize digunakan untuk mengubah string kembali menjadi objek.

MrGlass
sumber
apa penjelasan dari 'representasi yang dapat disimpan'?
Istiaque Ahmed
ive hanya terlihat serialize digunakan ketika seseorang ingin mengambil array php dan menyimpannya dalam database. Anda dapat membuat serial, menyimpan output dalam bidang string standar di database Anda, lalu mengambil dan membatalkan serialnya saat Anda ingin menggunakannya lagi.
MrGlass
1

Pada dasarnya, ketika Anda membuat serial array atau objek, Anda cukup mengubahnya menjadi format string yang valid sehingga Anda dapat dengan mudah menyimpannya di luar skrip php.

  1. Gunakan serialize untuk menyimpan status objek dalam database (mari kita ambil kelas User sebagai contoh) Selanjutnya unserialize data untuk memuat status sebelumnya kembali ke objek (metode bukan serializer Anda perlu menyertakan kelas objek untuk dapat menggunakan Itu)
    • personalisasi pengguna

Catatan untuk objek Anda harus menggunakan metode __sleep dan __wakeup ajaib. __sleep dipanggil oleh serialize (). Metode sleep akan mengembalikan array nilai dari objek yang ingin Anda pertahankan.

__wakeup dipanggil oleh unserialize (). Metode bangun harus mengambil nilai-nilai yang tidak berseri dan menginisialisasinya di dalamnya dalam objek.

Untuk melewatkan data antara php dan js Anda akan menggunakan json_encode untuk mengubah array php menjadi format json yang valid. Atau sebaliknya - gunakan JSON.parese () untuk mengubah data keluaran (string) menjadi objek json yang valid. Anda ingin melakukannya untuk memanfaatkan penyimpanan lokal. (akses data offline)

DevWL
sumber
Mengapa seseorang perlu membuat serial jika ada json_encode? Tolong jelaskan jika Anda tahu. Terima kasih.
Yevgeniy Afanasyev
1
Anda bisa mendapatkan keuntungan dari dapat menyesuaikan metode sulap yang dikumpulkan saat menggunakan serialisasi dan unserialise. Yang mengatakan Anda dapat mengambil Json_encode () dan json_decode () lebih jauh dan setiap objek dapat menangani fungsi ini dengan cara yang unik. Inilah mengapa Anda ingin menggunakannya.
DevWL
1
Ada lebih dari itu. Lihat jawaban ini untuk info lebih lanjut stackoverflow.com/questions/804045/…
DevWL
1
json_encode lebih cepat (tergantung pada versi PHP yang Anda gunakan), json decode sebagai stdClass, objek serilized unserialize sebagai instance Kelas yang sebenarnya, Beberapa konfigurasi harus saya buat ke JSON untuk mempertahankan encoding UTF-8 tidak berubah, serialize tidak mengubah encoding. Jika Anda ingin membuat data lintas platform menggunakan JSON, Jika Anda hanya bekerja di PHP, Anda dapat menggunakan metode ajaib __sleep dan __wakeup untuk menyesuaikan serialisasi.
DevWL
0

Ya saya bisa. Asumsikan kita perlu melacak sistem Anda berarti Dalam sistem Anda memiliki lebih dari satu admin dan subadmin, Semua ini dapat memasukkan atau memperbarui atau mengedit informasi apa pun. Nanti Anda perlu tahu siapa yang membuat perubahan ini. Untuk mengatasi masalah ini, Anda perlu membuat serial.

  **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)

Saya harap ini akan membantu Anda.


sumber
-1
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');
X 47 48 - IR
sumber