सेतुकी के तुरंत बाद $ _COOKIE एक्सेस करना ()


80

मैं PHP में फ़ंक्शन को $_COOKIEकॉल करने के तुरंत बाद एक कुकी के मूल्य (उपयोग करके ) तक पहुंचने की कोशिश कर रहा हूं setcookie()। जब मैं ऐसा करता हूं, $_COOKIE['uname']सेट नहीं किया जाता है। क्यों?

ध्यान दें, हालांकि, यह $_COOKIE['uname']स्क्रिप्ट के अगले निष्पादन पर अपेक्षित है, जैसे पृष्ठ ताज़ा करने के बाद।

setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];

दुर्भाग्य से यहां के जवाब एक समाधान की पेशकश नहीं करते हैं या यहां तक ​​कि स्वीकार किए जाते हैं खराब वर्कअराउंड का सुझाव देते हैं, देखें stackoverflow.com/questions/3230133#34465594
विक्रिनि

@witrin आपके दिए गए लिंक को इसी q / a पर पुनर्निर्देशित करता है।
ट्रैनोसैसिस

यह संभव नहीं है। आपको इसे "नकली" करना होगा, या तो $_COOKIEस्वयं में संबंधित प्रविष्टियों को सेट करके या तुरंत (उसी पृष्ठ पर) एक रीडायरेक्ट करके।
कौवा

जवाबों:


37

$_COOKIEवेब के स्टेटलेस प्रकृति के कारण पृष्ठ लोड होने पर सेट किया जाता है। यदि आप तत्काल पहुंच चाहते हैं, तो आप $_COOKIE['uname']खुद को सेट कर सकते हैं या एक मध्यवर्ती चर का उपयोग कर सकते हैं ।

उदाहरण के लिए:

if (isset($_COOKIE['uname'])) {
    // get data from cookie for local use
    $uname = $_COOKIE['uname'];
}
else {
    // set cookie, local $uname already set
    setcookie('uname', $uname, time() + 1800);  
}

21
यह पृष्ठ ताज़ा करने से पहले कुकी को सुलभ नहीं बनाता है ... मार्क बेकर के उत्तर के लिए आगे नीचे देखें :)
pathfinder

यह सच नहीं है। मैंने ओपी कोड के आधार पर धारणा बनाई है, जिसका उपयोग वे $unameअपनी लिपि में करते हैं। जबकि मार्क बेकर $_COOKIE['uname']सीधे इस्तेमाल करते हैं।
जेसन मैकक्रेरी

1
मुझे खेद है कि मैंने इसे थोड़ा गलत कहा। मेरे उद्देश्यों के लिए, जो एक अतुल्यकालिक स्क्रिप्ट के लिए हैं, $ _COOKIE की स्थापना वास्तव में कुकी को सेट नहीं करती है और इसे ब्राउज़र में वापस भेजती है (मुझे वहां कुकी की भी आवश्यकता थी), इसने केवल इसे मेरी स्क्रिप्ट में उपलब्ध कराया। आपको सेटकुकी () का भी उपयोग करने की आवश्यकता है, जो मार्क बेकर का जवाब है। साथ ही उनका कोड Google खोज से यहां आने वाले लोगों के लिए बहुत छोटा और अधिक उपयोगी है।
पाथफाइंडर

मैं उपयोग करता हूं setcookie()। यह उत्तर आपकी सटीक आवश्यकताओं को पूरा नहीं कर सकता है। लेकिन यह गलत नहीं है । ओपी और एसओ ने इस उत्तर को उपयोगी पाया है।
जेसन मैककरी

2
मुझे समझ नहीं आता कि इस उत्तर को "उत्तर" के रूप में क्यों चिह्नित किया गया है। यह बताता नहीं है कि कुकी को सीधे कैसे उपयोग किया जाए, और प्रदान किया गया कोड उसी ओपी के समान है। setcookie()उस कोड के बाद इसे एक्सेस करना संभव नहीं है$_COOKIE['uname']
Isthar

153

कुकी को तब तक सेट नहीं किया जाता है जब तक कि ग्राहक को प्रतिक्रिया नहीं भेजी जाती है, और उसके बाद ग्राहक से अगले अनुरोध तक आपके पीएचपी में उपलब्ध नहीं है।

हालाँकि, जब आप कुकी को अपनी स्क्रिप्ट में सेट करते हैं, तो आप कर सकते हैं:

setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;

2
बहुत ही सरल उपाय। धन्यवाद!
dawoodman71

1
उत्तम सामग्री। मुझे आश्चर्य है कि दूसरी पंक्ति की समाप्ति समय कैसे तय होता है जब यह पारित नहीं होता है?
शहीद

2
@martinedwards दूसरी पंक्ति कोई समाप्ति समय निर्धारित नहीं करती है .... यह अनुरोध की अवधि के लिए निर्धारित है; ठीक उसी तरह से जैसे कि एक ब्राउज़र से एक अनुरोध के साथ पारित कुकी मूल्य अनुरोध की अवधि के लिए मौजूद है
मार्क बेकर

@MarkBaker सरल समाधान !! बहुत बहुत धन्यवाद
शान

आपके कहने का मतलब है। कुकी मान तक पहुंचने के लिए, पृष्ठ (php फ़ाइल) को दो बार एक्सेस करना होगा। कुकी सेट करने के लिए 1 बार, और सेट कुकी तक पहुंचने के लिए 2 बार। सही बात?
प्रत्यूष

31

यदि आप कॉल करने के तुरंत बाद कुकी के मूल्य तक पहुँच प्राप्त करना चाहते हैं तो आप setcookie()उपयोग नहीं कर सकते $_COOKIEइसका कारण प्रोटोकॉल की प्रकृति में है (देखें https://tools.ietf.org/html/rfc6265 )। जब आप इसका उपयोग करते हैं setcookie()तो एक कुकी को HTTP हेडर के बाकी क्लाइंट को भेजने के लिए भेजा जाता है ( http://php.net/manual/en/function.setcookie.php देखें )। लेकिन $_COOKIEदूसरी तरफ क्लाइंट ( HTTP://php.net/manual/en/reserved.variables.cookies.php ) से HTTP कुकीज़ के माध्यम से वर्तमान स्क्रिप्ट को पारित चर शामिल हैं ।

जब आप $_COOKIEकॉल करने के बाद बदलते हैं setcookie()- जैसे कुछ उत्तर यहाँ सुझाए गए हैं - इसमें क्लाइंट से केवल कुकीज़ शामिल नहीं है। यह आपके आवेदन में प्रयुक्त तृतीय पक्ष कोड में की गई मान्यताओं के साथ हस्तक्षेप कर सकता है और इसके परिणामस्वरूप अवांछित साइट प्रभाव हो सकता है। तो सामान्य तौर पर यह अच्छा अभ्यास नहीं है और यह केवल एक विकल्प है जब कॉल setcookie()आपके स्वयं के कोड का हिस्सा होते हैं।

एक setcookie()ही अनुरोध के साथ एक मूल्य निर्धारित करने के लिए एक साफ और पारदर्शी तरीका उपयोग करना है headers_list()(देखें http://php.net/manual/en/function.headers-list.php ) :

function getcookie($name) {
    $cookies = [];
    $headers = headers_list();
    // see http://tools.ietf.org/html/rfc6265#section-4.1.1
    foreach($headers as $header) {
        if (strpos($header, 'Set-Cookie: ') === 0) {
            $value = str_replace('&', urlencode('&'), substr($header, 12));
            parse_str(current(explode(';', $value, 1)), $pair);
            $cookies = array_merge_recursive($cookies, $pair);
        }
    }
    return $cookies[$name];
}
// [...]
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . getcookie('uname');

लेकिन ध्यान दें कि यह PHP CLI (जैसे PHPUnit) में काम नहीं करेगा। ऐसे मामले में आप XDebug जैसे तृतीय पक्ष एक्सटेंशन ( http://xdebug.org/docs/all_functions#xdebug_get_headers ) का उपयोग कर सकते हैं ।


6
यहां केवल एक वास्तविक समाधान है। 3 पार्टी कोड के संशोधनों के बिना स्वच्छ, जिसमें सेटक्यूकी हो सकता है।
माइकल

1
मुझे यकीन नहीं है कि ऑप ने दूसरे समाधान के लिए मतदान क्यों किया, लेकिन यह सही समाधान है जिसने वास्तव में मेरी मदद की।
ChrisP777

यह 100% एकमात्र उत्तर है जो उत्पादन वातावरण के लिए व्यवहार्य है। महान समाधान @witrin
स्किडडॉन

मुझे पता नहीं क्यों, लेकिन मेरे लिए $ सीमा पैरामीटर explode()मेरे लिए काम नहीं करता है, बस एक स्ट्रिंग तत्व को पूरे स्ट्रिंग के साथ अंदर लौटाता है
NaturalBornCamper

5

आपको कुकी चर को अपने द्वारा सेट करना होगा यदि आपको तुरंत इसकी आवश्यकता होती है, तो जब तक आप किसी अन्य पृष्ठ को लोड करते हैं तब तक वास्तविक कुकी setcookie विधि के परिणामस्वरूप सेट हो जाती।

setcookie('name', $value, time()+60*30);
$_COOKIE ['name'] = $value;

1

हम AJAX कॉलिंग का उपयोग करके ऐसा कर सकते हैं।

अगर हम बटन पर कुकीज़ बनाना चाहते हैं तो सबसे पहले कुकीज़ बनाने के लिए एक AJAX कॉल करें फिर पहली AJAX कॉलिंग की सफलता हम कुकीज़ प्राप्त करने के लिए एक और AJAX कॉल कर सकते हैं।

    function saveCookie() {
            var base_url = $('#base_url').val();
            var url = base_url + '/index/cookie';
            $.ajax({
                'url': url,
                'type': 'POST',
                'success': function (data) {
                    if (data) {
                        var url = base_url + '/index/get_cookie';
                        $.ajax({
                            'url': url,
                            'type': 'POST',
                            'success': function (response) {
                                var container = $('#show');
                                if (response) {
                                    container.html(response);
                                }
                            }
                        });
                    }
                }
            });
        }

    <button type="button" onclick="saveCookie()">Save Cookie</button>
    <div id="show"></div>

जान लें कि जब इरादे अच्छे होते हैं, तब भी ओपी को केवल एक उत्तर की आवश्यकता होती है। :) शायद इसीलिए आपके पास डाउनवोट्स हैं, मैंने आपको डाउनवोट नहीं किया।
मक्सिमा कोन्मेज़

upvoted क्योंकि यह भी एक दृष्टिकोण है जिस पर विचार किया जाना चाहिए!
ध्रुव ठक्कर

1

मुझे एक समान समस्या थी जहां मैंने एक सम्मिलित फ़ाइल से एक फ़ंक्शन का उपयोग किया और इसे एक फ़ंक्शन के साथ हल किया कि दोनों कुकी का मान लौटाता है और कुकी सेट करता है।

function setCookie($input) {
  setcookie('uname', $input, time() + 60 * 30);
  return $input;
}

if(!isset($_COOKIE['uname'])) {
    $uname  = setCookie($whatever);
} else {
    $uname = $_COOKIE['uname'];
}

echo "Cookie value: " . $uname;

-1

Ob_start () और ob_flush () का उपयोग करके आप कुकी को क्लाइंट को भेज सकते हैं और उसी रन टाइम में इसे पुनः प्राप्त कर सकते हैं। इसे इस्तेमाल करे:

ob_start();
setcookie('uname', $uname, time() + 60 * 30);
ob_flush();
echo "Cookie value: " . $_COOKIE['uname'];

यह काम करने के लिए प्रतीत नहीं होता (PHP 5.4 w / nginx)। क्या आप विस्तार कर सकते हैं?
पॉल डेलरे

-1

setcookie()जब आपकी वेब साइट पहली बार पृष्ठ को पुनः लोड करने का अनुरोध करती है, तो आपकी स्क्रिप्ट का कार्य चलता है। यह कुकी उपयोगकर्ताओं के ब्राउज़र में संग्रहीत होती है और अगले अनुरोध तक या आपके मामले में अगले रील तक सर्वर पर चलने वाली आपकी स्क्रिप्ट के लिए उपलब्ध नहीं होती है।

अगले अनुरोध पर ब्राउज़र उस कुकी को सर्वर को भेजता है और सरणी $_COOKIEमें वह मूल्य होगा जो आपने शुरू में सेट किया था और दूसरे अनुरोध पर ब्राउज़र ने वापस भेजा।


-3

मैं एक ही समय में एक कुकी सेट किया गया था

define('CONSTANT', true);
return setcookie('cookiename', 'cookie value goes here', time() + 60 * 60 * 24 * 30, '/');

मैं तब तुरंत कुछ कर सकता हूं:

if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.