cookies - कुकीज़ PHP में Arrays




(7)

कुकीज़ पर serialize और unserialize का उपयोग एक सुरक्षा जोखिम है। उपयोगकर्ता (या हमलावर) कुकी डेटा को बदल सकते हैं, फिर जब आप इसे अनसुलझा करते हैं, तो यह आपके सर्वर पर PHP कोड चला सकता है। कुकी डेटा पर भरोसा नहीं किया जाना चाहिए। इसके बजाए JSON का प्रयोग करें!

PHP साइट से ...

अविश्वसनीय उपयोगकर्ता इनपुट को unserialize () पर पास न करें। ऑब्जेरियलाइजेशन के परिणामस्वरूप ऑब्जेक्ट इंस्टेंटेशन और ऑटोलोडिंग के कारण कोड लोड और निष्पादित किया जा सकता है, और एक दुर्भावनापूर्ण उपयोगकर्ता इसका शोषण करने में सक्षम हो सकता है। यदि आपको उपयोगकर्ता को क्रमबद्ध डेटा पास करने की आवश्यकता है तो JSON (json_decode () और json_encode () के माध्यम से एक सुरक्षित, मानक डेटा इंटरचेंज प्रारूप का उपयोग करें।

कुकी में सरणी को स्टोर करने का उचित तरीका कैसा है? PHP कोड उदाहरण में:

$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;

कुकी में सरणी मानों को संग्रहीत करने के लिए, पहले आपको उन्हें स्ट्रिंग में कनवर्ट करने की आवश्यकता है, इसलिए यहां कुछ विकल्प हैं।

जेएसओएन के रूप में कुकीज़ संग्रहीत करना

कोड संग्रहित करना

setcookie('your_cookie_name', json_encode($info), time()+3600);

कोड पढ़ना

$data = json_decode($_COOKIE['your_cookie_name'], true);

यदि आपको जावास्क्रिप्ट के साथ फ्रंट एंड में पढ़ने की कुकी की आवश्यकता है तो JSON भी अच्छा चयन कर सकता है।

असल में आप किसी भी encrypt_array_to_string decrypt_array_from_string उदाहरण के लिए आप पूर्णांक की सरणी के लिए explode / implode का भी उपयोग कर सकते हैं।

चेतावनी: serialize / unserialize का उपयोग न करें

PHP.net से

Do not pass untrusted user input to unserialize(). - कुकीज़ सहित HTTP द्वारा आने वाली कुछ भी अविश्वसनीय है!

सुरक्षा से संबंधित संदर्भ

वैकल्पिक समाधान के रूप में, आप सरणी को स्ट्रिंग में परिवर्तित किए बिना भी कर सकते हैं।

setcookie('my_array[0]', 'value1' , time()+3600);
setcookie('my_array[1]', 'value2' , time()+3600);
setcookie('my_array[2]', 'value3' , time()+3600);

और यदि आप $_COOKIE चर मुद्रित करेंगे, तो आप निम्न देखेंगे

echo '<pre>';
print_r( $_COOKIE );
die();
Array
(   
    [my_array] => Array
        (
            [0] => value1
            [1] => value2
            [2] => value3
        )

)

यह पीएचपी फीचर दस्तावेज है।

PHP.net से

Cookies names can be set as array names and will be available to your PHP scripts as arrays but separate cookies are stored on the user's system.


आप अलग-अलग कुकीज़ में विभिन्न तत्व लिखने का भी प्रयास कर सकते हैं। कुकीज नाम सरणी नाम के रूप में सेट किए जा सकते हैं और आपके PHP स्क्रिप्ट्स को सरणी के रूप में उपलब्ध होंगे लेकिन अलग-अलग कुकीज़ उपयोगकर्ता के सिस्टम पर संग्रहीत की जाती हैं। कई कुकी और मानों के साथ एक कुकी सेट करने के लिए विस्फोट () पर विचार करें। इस उद्देश्य के लिए serialize () का उपयोग करने की अनुशंसा नहीं की जाती है, क्योंकि इसका परिणाम सुरक्षा छेद हो सकता है। अधिक जानकारी के लिए setcookie PHP फ़ंक्शन देखें


serialize() प्रयास करें। यह एक सरणी को एक स्ट्रिंग प्रारूप में परिवर्तित करता है, फिर आप इसे वापस सरणी में परिवर्तित करने के लिए unserialize() का उपयोग कर सकते हैं। वर्डप्रेस की तरह लिपियों का उपयोग एकाधिक मानों को एक डेटाबेस फ़ील्ड में सहेजने के लिए किया जाता है।

आप json_encode() का भी उपयोग कर सकते हैं क्योंकि रॉब ने कहा था, जो उपयोगी हो सकता है यदि आप जावास्क्रिप्ट में कुकी को पढ़ना चाहते हैं।


डेटा को क्रमबद्ध करें:

setcookie('cookie', serialize($info), time()+3600);

फिर डेटा को बेअसर करें:

$data = unserialize($_COOKIE['cookie']);

डेटा के बाद, $ जानकारी और $ डेटा में एक ही सामग्री होगी।


हाल ही में मैंने अपने क्लाइंट के लिए यह कोड बनाया है, मैं इस कोड में कुकी के लिए सरणी का उपयोग कर रहा हूं, वास्तव में इस कोड को कुकीज़ का उपयोग करके उपयोगकर्ता द्वारा पृष्ठों को देखा जाता है, उम्मीद है कि यह आपकी मदद करता है ...!

function curPageURL() { // get url
return 'http' . ((
!empty($_SERVER['HTTPS']) &&
$_SERVER['HTTPS'] !== 'off' ||
$_SERVER['SERVER_PORT'] == 443
) ? 's' : '') . '://' . $_SERVER['SERVER_NAME'] . (
$_SERVER['SERVER_PORT'] == 80 ? '' :  $_SERVER['SERVER_PORT']
) . $_SERVER['REQUEST_URI'];
}

$currentPage = curPageURL(); // call function
$counter = $_COOKIE['_counter']; // set counter variable

if(!$_COOKIE['_PAGES']){ // if _Pages cookie
$default = 1; // set default value to 1
setcookie("_counter",$default,time()+7200); // set counter cookie
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie  
}
else{ // if ! _Pages cookie 
$default = $counter+1; // set default value to +1
setcookie("_counter",$default,time()+7200); // set counter cookie
}


if(@in_array($currentPage, @$_COOKIE['_PAGES'])){ // if same url found
}
else{ // if new url found
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie  
}


if($_COOKIE['_PAGES']){
foreach ($_COOKIE['_PAGES'] as $value){
    echo "<a href='{$value}'>{$value}</a>";
} 
}

पीछे लूप

मुझे लगता है कि लूप के विपरीत रिवर्स यहां उल्लेखनीय है:

for (var i = array.length; i--; ) {
     // process array[i]
}

लाभ:

  • आपको एक अस्थायी len परिवर्तनीय घोषित करने की आवश्यकता नहीं है, या प्रत्येक पुनरावृत्ति पर array.length खिलाफ तुलना करें, जिनमें से कोई भी एक मिनट अनुकूलन हो सकता है।
  • रिवर्स ऑर्डर में डीओएम से भाई बहन को हटाकर आमतौर पर अधिक कुशल होता है । (ब्राउजर को अपने आंतरिक सरणी में तत्वों को कम स्थानांतरित करने की आवश्यकता है।)
  • यदि आप इंडेक्स पर या उसके बाद लूपिंग करते समय सरणी को संशोधित करते हैं (उदाहरण के लिए आप array[i] पर कोई आइटम हटाते हैं या डालें), तो एक फॉरवर्ड लूप उस आइटम को छोड़ देगा जो स्थिति में बायीं ओर स्थानांतरित हो गया है, या मैं फिर से संसाधित करता हूं वें आइटम जो सही स्थानांतरित किया गया था। लूप के लिए पारंपरिक में, आप मुझे अगले आइटम को इंगित करने के लिए अपडेट कर सकते हैं जिसके लिए प्रसंस्करण की आवश्यकता होती है - 1, लेकिन पुनरावृत्ति की दिशा को उलटना अक्सर एक सरल और अधिक सुरुचिपूर्ण समाधान होता है
  • इसी प्रकार, नेस्टेड डीओएम तत्वों को संशोधित या हटाते समय, रिवर्स में प्रसंस्करण त्रुटियों को बाधित कर सकता है। उदाहरण के लिए, अपने बच्चों को संभालने से पहले माता-पिता नोड के आंतरिक HTML को संशोधित करने पर विचार करें। जब तक बच्चा नोड पहुंचाया जाता है तब तक इसे डीओएम से अलग किया जाएगा, जिसे नवजात शिशु द्वारा प्रतिस्थापित किया गया है जब माता-पिता का आंतरिक HTML लिखा गया था।
  • उपलब्ध कुछ अन्य विकल्पों की तुलना में यह टाइप करने और पढ़ने के लिए छोटा है। हालांकि यह forEach() और ES6 के for ... of के for ... of खो देता है।

नुकसान:

  • यह वस्तुओं को रिवर्स ऑर्डर में संसाधित करता है। यदि आप परिणामों से एक नई सरणी बना रहे थे, या स्क्रीन पर चीजों को प्रिंट कर रहे थे, तो स्वाभाविक रूप से मूल ऑर्डर के संबंध में आउटपुट को उलट दिया जाएगा
  • अपने आदेश को बनाए रखने के लिए पहले बच्चे के रूप में डीओएम में भाई बहनों को बार-बार सम्मिलित करना कम कुशल है । (ब्राउजर सही चीजों को स्थानांतरित करना जारी रखेगा।) डोम नोड्स को कुशलतापूर्वक बनाने के लिए और क्रम में, केवल लूप आगे बढ़ें और सामान्य के रूप में संलग्न करें (और "दस्तावेज़ खंड" का भी उपयोग करें)।
  • रिवर्स लूप जूनियर डेवलपर्स को भ्रमित कर रहा है। (आप अपने दृष्टिकोण के आधार पर एक लाभ पर विचार कर सकते हैं।)

क्या मुझे हमेशा इसका इस्तेमाल करना चाहिए?

कुछ डेवलपर डिफ़ॉल्ट रूप से लूप के लिए रिवर्स का उपयोग करते हैं, जब तक कि आगे लूप के लिए कोई अच्छा कारण न हो।

हालांकि प्रदर्शन लाभ आमतौर पर महत्वहीन होते हैं, यह चिल्लाने की तरह है:

"बस सूची में हर आइटम के लिए यह करो, मुझे आदेश की परवाह नहीं है!"

हालांकि व्यावहारिक रूप से यह वास्तव में इरादे का एक विश्वसनीय संकेत नहीं है , क्योंकि जब आप आदेश की परवाह करते हैं, तो उन अवसरों से यह अलग नहीं होता है, और वास्तव में विपरीत में लूप की आवश्यकता होती है। इसलिए वास्तव में "देखभाल न करें" इरादे को सटीक रूप से व्यक्त करने के लिए एक और निर्माण की आवश्यकता होगी, जो वर्तमान में forEachUnordered() सहित अधिकांश भाषाओं में अनुपलब्ध है, लेकिन जिसे कहा जा सकता है, उदाहरण के लिए, forEachUnordered()

अगर आदेश कोई फर्क नहीं पड़ता है, और दक्षता एक चिंता है (किसी गेम या एनीमेशन इंजन के सबसे निचले भाग में), तो यह आपके गो-टू पैटर्न के रूप में लूप के विपरीत रिवर्स का उपयोग करने के लिए स्वीकार्य हो सकता है। बस याद रखें कि मौजूदा कोड में लूप के लिए रिवर्स को देखने का मतलब यह नहीं है कि ऑर्डर अप्रासंगिक है!

प्रत्येक के लिए उपयोग करना बेहतर है ()

सामान्य रूप से उच्च स्तरीय कोड के लिए जहां स्पष्टता और सुरक्षा अधिक चिंताएं हैं, मैं आपके डिफ़ॉल्ट पैटर्न के रूप में Array::forEach का उपयोग करने की अनुशंसा करता हूं:

  • यह पढ़ने के लिए स्पष्ट है।
  • यह इंगित करता है कि मुझे ब्लॉक के भीतर स्थानांतरित नहीं किया जा रहा है (जो हमेशा के for और लूप के while लंबे समय तक छुपा एक संभावित आश्चर्य है।)
  • यह आपको बंद करने के लिए एक मुफ्त दायरा देता है।
  • यह स्थानीय चर के रिसाव और बाहरी चर के साथ आकस्मिक टक्कर (और उत्परिवर्तन) को कम कर देता है।

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

(यदि इरादे की चर्चा आपको कोई समझ नहीं देती है, तो आप और आपके कोड को प्रोग्रामिंग स्टाइल और आपके दिमाग पर क्रॉकफोर्ड के व्याख्यान को देखने से लाभ हो सकता है।)

यह कैसे काम करता है?

for (var i = 0; i < array.length; i++) { ... }   // Forwards

for (var i = array.length; i--; )    { ... }   // Reverse

आप देखेंगे कि i-- मध्य खंड है (जहां हम आमतौर पर तुलना देखते हैं) और अंतिम खंड खाली है (जहां हम आमतौर पर i++ देखते हैं)। इसका मतलब है कि i-- निरंतरता की स्थिति के रूप में भी प्रयोग किया जाता है। महत्वपूर्ण रूप से, यह प्रत्येक पुनरावृत्ति से पहले निष्पादित और जांच की जाती है।

  • यह बिना किसी विस्फोट के array.lengtharray.length पर कैसे शुरू कर सकता है?

    क्योंकि i-- प्रत्येक पुनरावृत्ति से पहले चलता है, पहले पुनरावृत्ति पर हम वास्तव में array.length - 1 पर वस्तु का उपयोग करेंगे। array.length - 1 जो ऐरे-आउट-ऑफ-बाउंड undefined वस्तुओं के साथ किसी भी समस्या से बचाता है।

  • इंडेक्स 0 से पहले यह फिर से क्यों नहीं रोकता है?

    लूप फिर से बंद हो जाएगा जब स्थिति i-- एक झूठी मान का मूल्यांकन करती है (जब यह 0 उत्पन्न करती है)।

    चाल यह है कि --i विपरीत, --i ऑपरेटर i लेकिन कमी से पहले मूल्य उत्पन्न करता है। आपका कंसोल इसे प्रदर्शित कर सकता है:

    > var i = 5; [i, i--, i];

    [5, 5, 4]

    तो अंतिम पुनरावृत्ति पर, मैं पहले 1 था और i-- अभिव्यक्ति इसे 0 में बदलती है लेकिन वास्तव में 1 (सत्य) उत्पन्न करती है, और इसलिए स्थिति गुजरती है। अगले पुनरावृत्ति पर i- मैं -1 को बदलता हूं लेकिन 0 (झूठी) उत्पन्न करता है, जिससे लूप के नीचे तुरंत निष्पादन होता है।

    लूप के लिए पारंपरिक आगे में, i++ और ++i विनिमय करने योग्य ++i (जैसा डगलस क्रॉकफोर्ड बताता है)। हालांकि लूप के विपरीत में, क्योंकि हमारी कमी भी हमारी हालत अभिव्यक्ति है, हमें i-- से i-- चाहिए - अगर हम आइटम को इंडेक्स 0 पर संसाधित करना चाहते हैं।

सामान्य ज्ञान

कुछ लोग लूप के विपरीत रिवर्स में थोड़ा तीर खींचना पसंद करते हैं, और एक विंक के साथ समाप्त होते हैं:

for (var i = array.length; i --> 0 ;) {

मुझे लूप के रिवर्स के लाभ और भय दिखाने के लिए डब्ल्यूवाईएल में क्रेडिट जाते हैं।







php arrays cookies