Php सीरियलाइज़ () और अनसेरिज़ल () का उपयोग कैसे करें


125

मेरी समस्या बहुत बुनियादी है।

मैं वास्तव में क्या करने के लिए के रूप में मेरी जरूरतों को पूरा करने के लिए किसी भी उदाहरण नहीं मिला serialize()और unserialize()php में मतलब? वे सिर्फ एक उदाहरण देते हैं - एक सरणी को क्रमबद्ध करें और एक अस्पष्टीकृत प्रारूप में आउटपुट दिखाएं। उनके शब्दजाल से गुजर रही मूल अवधारणा को समझना वास्तव में कठिन है।

संपादित करें:

<?php

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

?>

उत्पादन:

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

मैं दूसरा आउटपुट नहीं समझ सकता। इसके अलावा, क्या कोई ऐसी स्थिति का उदाहरण दे सकता है जिसे उपयोग करने से पहले मुझे php सरणी को क्रमांकित करना होगा?


10
यदि आप अभी भी "द्वितीयक आउटपुट" के बारे में उत्सुक थे, तो इसका काफी सरल: a = सरणी, आकार का 3 = तीन तत्व {} के भीतर हैं। इसके अंदर, आपके पास i = पूर्णांक / अनुक्रमणिका 1 है, लीन 6 की स्ट्रिंग "हाथी 1", पूर्णांक 2 बराबर है। आदि आदि। जब आप इसे पढ़ते हैं तो यह बिल्कुल स्पष्ट है। आप कई स्तर के सरणियों / वस्तुओं को आसानी से भीतर समाहित होने की कल्पना कर सकते हैं, हालांकि संशोधन बहुत नासमझी है, आपको वास्तव में संशोधित करने के लिए निरंतरता सुनिश्चित करनी चाहिए।
ग्रिजली

2
@IstiaqueAhmed, के बारे में "क्या कोई भी ऐसी स्थिति का उदाहरण दे सकता है, जिसे उपयोग करने से पहले मुझे php एरे को क्रमबद्ध करना होगा" , इस तरह के एक उदाहरण है stackoverflow.com/a/30436890/632951
Pacerier

@grizly धन्यवाद आदमी, मुझे लगता है कि दो साल के लिए की तरह एक जवाब की तलाश में किया गया है, मैं नहीं जानता था कि यह कैसे की व्याख्या है और न ही कैसे है कि सुविधा का उपयोग कर के लिए कारण संबद्ध करने के लिए, का जवाब के लिए धन्यवाद
isaacewing

जवाबों:


169

एक PHP सरणी या ऑब्जेक्ट या अन्य जटिल डेटा संरचना को ट्रांसपोर्ट किए गए PHP स्क्रिप्ट के बाहर परिवहन या संग्रहीत या अन्यथा उपयोग नहीं किया जा सकता है । यदि आप स्क्रिप्ट के एकल रन से परे इस तरह की जटिल डेटा संरचना को जारी रखना चाहते हैं , तो आपको इसे क्रमबद्ध करने की आवश्यकता है । इसका मतलब है कि संरचना को एक "निचले आम भाजक" में रखा जाए, जिसे डेटाबेस, पाठ फ़ाइलों, सॉकेट्स की तरह PHP के अलावा अन्य चीजों से भी नियंत्रित किया जा सकता है। मानक PHP फ़ंक्शन ऐसी चीज़ को व्यक्त करने के लिए serializeसिर्फ एक प्रारूप है, यह एक डेटा संरचना को एक स्ट्रिंग प्रतिनिधित्व में अनुक्रमित करता है जो PHP के लिए अद्वितीय है और इसका उपयोग करके PHP ऑब्जेक्ट में उलट किया जा सकता है unserialize। हालांकि JSON या XML जैसे कई अन्य प्रारूप हैं।


इस आम समस्या का उदाहरण लें:

मैं जावास्क्रिप्ट के लिए एक PHP सरणी कैसे पास करूं ?

PHP और जावास्क्रिप्ट केवल तार के माध्यम से संवाद कर सकते हैं। आप "foo"बहुत आसानी से जावास्क्रिप्ट को स्ट्रिंग पास कर सकते हैं । आप 1बहुत आसानी से जावास्क्रिप्ट को नंबर पास कर सकते हैं । आप बूलियन मान trueऔर falseआसानी से जावास्क्रिप्ट को पास कर सकते हैं । लेकिन आप इस सरणी को जावास्क्रिप्ट में कैसे पास करते हैं?

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

इसका उत्तर क्रमबद्धता है । PHP / जावास्क्रिप्ट के मामले में, JSON वास्तव में बेहतर क्रमांकन प्रारूप है:

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

लेकिन बहुत अधिक केवल PHP इसका उपयोग करता है, इस प्रारूप के लिए कहीं और बहुत कम समर्थन है।
हालांकि यह बहुत ही सामान्य और अच्छी तरह से समर्थित है:

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

कई परिस्थितियां हैं जहां आपको स्ट्रिंग्स के रूप में जटिल डेटा संरचनाओं को पास करने की आवश्यकता होती है । धारावाहिककरण, स्ट्रिंग्स के रूप में मनमाने ढंग से डेटा संरचनाओं का प्रतिनिधित्व करते हुए, यह हल करता है कि यह कैसे करना है।


1
उर स्पष्टीकरण मुझे क्या उम्मीद के करीब आ रहा है। क्या आप मेरे संपादन पर एक नज़र डाल सकते हैं?
इस्तियाक अहमद

1
a: 3: {i: 1; s: 6: "mm 1"; i: 2; s: 6: "elem 2"; i: 3; s: 3: {i: 1; s: 6; 7: "हाथी 3";} और अगर आपको कोई आपत्ति नहीं है, तो इसे js में भेजने के लिए सरणी को क्रमबद्ध करने का उदाहरण (इस पोस्ट के विषय के लिए प्रासंगिक नहीं हो सकता है)।
इस्तियाक अहमद

2
जहां तक ​​मुझे पता है कि शायद ही उस प्रारूप का कोई औपचारिक विनिर्देश पाया जाना है, लेकिन आप अनुमान लगा सकते हैं, क्या आप नहीं कर सकते? i:1= पूर्णांक 1, s:6:"elem 1"= 6 वर्णों के साथ स्ट्रिंग "एलएम 1" ... और आप किस उदाहरण के लिए पूछ रहे हैं, मुझे लगा कि मैंने एक दिया है?
deceze

"लेकिन आप इस सरणी को जावास्क्रिप्ट में कैसे पास करते हैं? ऐरे ([1] => एलएम 1 [2] => एलीम 2 [3] => एलीम 3)" ... इसके लिए सिर्फ सटीक कोड स्निपेट
इस्तियाक अहमद

echo json_encode($array);कैसे वास्तव में आप पारित यह परिस्थितियों पर निर्भर करता है। उस पर लटका मत करो।
deceze

27

PHP सीरियलाइज़ () 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);

जो आपको कुछ इस तरह से आउटपुट देता है

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

यदि आप मूल सरणी वापस प्राप्त करना चाहते हैं तो फिर से PHP unserialize () फ़ंक्शन का उपयोग करें

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

मुझे उम्मीद है कि इससे सहायता मिलेगी


7

जब आप अपने php वैल्यू को स्ट्रांग बनाना चाहते हैं, तो आपको इसे एक स्ट्रिंग वैल्यू के रूप में बदलना होगा, जो कि serialize () करता है। और उलटा () उलटा काम करता है।


1
'मनमोहक ’इसका क्या मतलब है? मैं संदर्भित पृष्ठ यू के माध्यम से चला गया था। क्या आप कृपया php, और mysql (यदि आवश्यक हो) में एक उदाहरण दिखा सकते हैं?
इस्तियाक अहमद

2
@ इस्टइक अहमद उदाहरण के लिए, जब आप डिस्क पर फ़ाइल के लिए एक सरणी संग्रहीत करना चाहते हैं, तो आप सीधे सरणी को सहेज नहीं सकते हैं, लेकिन इसे एक स्टर्लिंग मान में बदल सकते हैं और यह एक स्ट्रिंग है।
xdazz

लेकिन हम सीधे php mysql में इसे क्रमबद्ध किए बिना डेटाबेस में एक चर सम्मिलित कर सकते हैं। कृपया स्पष्टीकरण दें।
इस्तियाक अहमद

9
"हम इसे क्रमबद्ध किए बिना डेटाबेस में एक चर सम्मिलित कर सकते हैं" । यह केवल मूलभूत डेटा प्रकारों (स्ट्रिंग्स, पूर्णांक, संख्याओं) के लिए सही है। हम डीबी या फाइलसिस्टम में सीधे एरे और ऑब्जेक्ट नहीं डाल सकते हैं । यही कारण है कि serialize()और के unserialize()लिए बने हैं।
लोरेंजो-एस

आप कुछ जानकारी लेते हैं और इसके साथ अपनी php स्क्रिप्ट में कुछ काम करते हैं जो इसे कहीं स्टोर / भेजने के लिए तैयार है। आपके पास एक तालिका बनाने का विकल्प है जो अपेक्षित डेटा से बिल्कुल मेल खाता है, लेकिन यह थकाऊ है कि आप अनिवार्य रूप से अपने काम के बोझ को दोगुना कर रहे हैं क्योंकि आपको कोड लिखना होगा जो मैच से भी अधिक होता है, साथ ही डेटाबेस में बदलाव से कोड या इसके विपरीत में बदलाव की आवश्यकता होती है। जब क्रमबद्ध आप बस दो कॉलम आईडी इंट (10) और सूचना BLOB के साथ एक तालिका बना सकते हैं। सीरियल आपको सम्मिलित करने के लिए एक स्ट्रिंग देता है और डेटा को इसकी मूल स्थिति में वापस लाने का प्रयास करता है। ऐसे मामले नहीं हैं, जो php डॉक्स को कवर करते हैं।
क्रिस

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

इस प्रोग्राम को इसके इको आउटपुट को रन करें

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


यहाँ
एक = सरणी का आकार
i = सरणी संख्याओं की संख्या
= सरणी मानों का आकार

आप डेटाबेस में डेटा की सरणी को स्टोर करने के लिए क्रमबद्ध का उपयोग कर सकते हैं
और उपयोग करने के लिए डेटा को UN-serialize पुनः प्राप्त कर सकते हैं।


6

अधिकांश स्टोरेज माध्यम स्ट्रिंग प्रकार स्टोर कर सकते हैं । वे सीधे एक सरणी या ऑब्जेक्ट जैसे PHP डेटा संरचना को स्टोर नहीं कर सकते हैं, और उन्हें नहीं करना चाहिए, क्योंकि यह PHP के साथ डेटा स्टोरेज माध्यम को जोड़ेगा।

इसके बजाय, serialize()आप इनमें से एक संरचना को एक स्ट्रिंग के रूप में संग्रहीत करने की अनुमति देते हैं। इसके स्ट्रिंग प्रतिनिधित्व से इसे क्रमबद्ध किया जा सकता है unserialize()

आप से परिचित हैं json_encode()और json_decode()(और सामान्य में JSON), अवधारणा समान है।


json से परिचित। अभी भी php बात में अस्पष्टता है। मेरी पोस्ट संपादित की
इस्तियाक अहमद

अगर कोई json_encode है तो धारावाहिक की आवश्यकता क्यों है? अगर आपको पता हो तो कृपया बताएं। धन्यवाद।
येवगेनी अफानसेयेव

1
@YevgeniyAfanasyev शायद आप डेटा के कुछ सबसेट के लिए नहीं हैं। लेकिन मुझे लगता है कि serialize()JSON की भविष्यवाणी करता है।
एलेक्स

5

कृप्या! कृप्या! कृप्या! डेटा क्रमबद्ध न करें और इसे अपने डेटाबेस में रखें। धारावाहिक का उपयोग उस तरह से किया जा सकता है, लेकिन यह एक संबंधपरक डेटाबेस का बिंदु और आपके डेटाबेस इंजन में निहित डेटाटिप्स को याद कर रहा है। ऐसा करने से आपके डेटाबेस में डेटा गैर-पोर्टेबल, पढ़ने में मुश्किल और प्रश्नों को जटिल बना सकता है। यदि आप चाहते हैं कि आपका एप्लिकेशन अन्य भाषाओं के लिए पोर्टेबल हो, तो जैसे मान लें कि आप पाते हैं कि आप अपने ऐप के कुछ हिस्से के लिए जावा का उपयोग करना चाहते हैं जिससे समझ में आता है कि जावा का उपयोग करना, क्रमबद्धता नितंबों में दर्द बन जाएगा। आपको डेटाबेस में डेटा डालने के लिए थर्ड पार्टी मध्यस्थ उपकरण का उपयोग किए बिना डेटा को क्वेरी और संशोधित करने में हमेशा सक्षम होना चाहिए।

कोड, पोर्टेबिलिटी मुद्दों के साथ कोड को बनाए रखना वास्तव में मुश्किल हो जाता है, और डेटा जो अन्य RDMS सिस्टम, नए स्कीमा, आदि में माइग्रेट करना अधिक कठिन है। इसमें आपके डेटाबेस में से किसी एक के आधार पर खोज करने के लिए इसे गड़बड़ करने का अतिरिक्त नुकसान भी है आपके द्वारा अनुक्रमित फ़ील्ड।

यह कहना नहीं है कि क्रमबद्ध () बेकार है। यह नहीं है ... इसका उपयोग करने के लिए एक अच्छी जगह कैश फ़ाइल हो सकती है जिसमें उदाहरण के लिए डेटा गहन संचालन का परिणाम होता है। वहाँ दूसरों के टन कर रहे हैं ... बस धारावाहिक का दुरुपयोग न करें क्योंकि जो अगले आदमी के साथ आता है उसका रखरखाव या प्रवास दुःस्वप्न होगा।

सीरियलाइज़ का अच्छा उदाहरण () और अनसेरिज़ल () इस तरह हो सकता है:

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

पृष्ठ पर अनसब्सक्राइब करें

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

2
बशर्ते कोड में कई सुरक्षा कमजोरियां हों, जो लोग आते हैं और कोड चिपकाने की नकल करते हैं, उन्हें चेतावनी दी जानी चाहिए।
डैनियल डब्ल्यू।

यह देखते हुए कि कोड searilize और unserialize फ़ंक्शन का उपयोग करने का एक उदाहरण है।
अवनीश अलोक

2

से http://php.net/manual/en/function.serialize.php :

एक मूल्य का एक सुंदर प्रतिनिधित्व उत्पन्न करता है। यह उनके प्रकार और संरचना को खोए बिना PHP मानों को संग्रहीत या पास करने के लिए उपयोगी है।

अनिवार्य रूप से, यह एक php सरणी या ऑब्जेक्ट लेता है और इसे एक स्ट्रिंग में कनवर्ट करता है (जिसे आप तब फिट कर सकते हैं या स्टोर कर सकते हैं जैसा कि आप फिट देखते हैं)।

Unserialize का उपयोग स्ट्रिंग को ऑब्जेक्ट में बदलने के लिए किया जाता है।


'मनमोहक प्रतिनिधित्व' की व्याख्या क्या है?
इस्तियाक अहमद

ive केवल देखा गया क्रमिक उपयोग किया जाता है जब कोई php सरणी लेना चाहता था और इसे डेटाबेस में संग्रहीत करता है। आप अपने डेटाबेस में एक मानक स्ट्रिंग फ़ील्ड में आउटपुट को सीरियल कर सकते हैं, और फिर जब आप इसे फिर से उपयोग करना चाहते हैं, तो इसे हथियाने और अनसुना कर सकते हैं।
श्रीग्लास 12

1

असल में, जब आप सरणियों या वस्तुओं को क्रमबद्ध करते हैं, तो आप इसे एक वैध स्ट्रिंग प्रारूप में बदल देते हैं, ताकि आप उन्हें आसानी से phy स्क्रिप्ट के बाहर संग्रहीत कर सकें।

  1. डेटाबेस में किसी ऑब्जेक्ट की स्थिति को बचाने के लिए क्रमांकन का उपयोग करें (उपयोगकर्ता वर्ग को एक उदाहरण के रूप में लेने देता है) पिछले स्टेट को ऑब्जेक्ट पर वापस लोड करने के लिए डेटा को अनसुना करना यह)
    • उपयोगकर्ता का निजीकरण

ऑब्जेक्ट के लिए ध्यान दें आपको जादू __सलीप और __wakeup विधियों का उपयोग करना चाहिए। __sleep को क्रमबद्ध () द्वारा कहा जाता है। एक नींद विधि उस ऑब्जेक्ट से मानों की एक सरणी लौटाएगी जिसे आप जारी रखना चाहते हैं।

__wakeup को unserialize () द्वारा कहा जाता है। एक वेकअप विधि को अज्ञात मान लेना चाहिए और उन्हें ऑब्जेक्ट में इनिशियलाइज़ करना चाहिए।

Php और js के बीच डेटा पास करने के लिए आप json_encode का उपयोग php सरणी को मान्य json प्रारूप में बदलने के लिए करेंगे। या अन्य तरह से राउंड - JSON.parese () को आउटपुट डेटा (स्ट्रिंग) को वैध जोंस ऑब्जेक्ट में बदलने के लिए उपयोग करें। आप स्थानीय भंडारण का उपयोग करने के लिए ऐसा करना चाहते हैं। (ऑफ़लाइन डेटा एक्सेस)


अगर कोई json_encode है तो धारावाहिक की आवश्यकता क्यों है? अगर आपको पता हो तो कृपया बताएं। धन्यवाद।
येवगेनी अफानसेयेव

1
आप जादुई विधि को अनुकूलित करने में सक्षम होने से लाभ उठा सकते हैं जो क्रमबद्ध और अचूक उपयोग करते समय टकराते हैं। कहा कि आप Json_encode () और json_decode () बहुत फ़्यूहर ले सकते हैं और प्रत्येक ऑब्जेक्ट अपने अनूठे तरीके से इस फ़ाइनेंसिनो को संभाल सकता है। यही कारण है कि आप उनका उपयोग करना चाहेंगे।
DevWL

1
इसमें और भी बहुत कुछ है। अधिक जानकारी के लिए इस उत्तर को देखें stackoverflow.com/questions/804045/…
DevWL

1
json_encode अधिक तेज़ है (PHP संस्करण का आप उपयोग कर रहे हैं पर निर्भर करता है), json decodes stdClass के रूप में, सीरिज़्ड ऑब्जेक्ट को वास्तविक श्रेणी के उदाहरण के रूप में निरूपित करता है, कुछ कॉन्फ़िगरेशन मुझे JSON से UTF-8 एन्कोडिंग को बदलने के लिए बनाया गया है, क्रमांकन एन्कोडिंग नहीं बदलता है। यदि आप डेटा क्रॉस प्लेटफ़ॉर्म JSON का उपयोग करना चाहते हैं, यदि आप केवल PHP में काम करते हैं तो आप क्रमांकन को अनुकूलित करने के लिए __sleep और __wakeup मैजिक विधि का उपयोग कर सकते हैं।
DevWL

0

हाँ मैं कर सकता हूँ। मान लें कि हमें आपके सिस्टम को ट्रैक करने की आवश्यकता है, आपके सिस्टम में एक से अधिक एडमिन और सबडमिन हैं, ये सभी किसी भी जानकारी को डाल सकते हैं या अपडेट कर सकते हैं या संपादित कर सकते हैं। आपको यह जानने की जरूरत है कि यह बदलाव कौन करता है। इस समस्या को हल करने के लिए आपको क्रमबद्ध की आवश्यकता है।

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

उम्मीद है इससे आपको मदद मिलेगी।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.