एक कुकी निकालें


260

जब मैं एक कुकी निकालने की कोशिश करता हूं तो मैं कोशिश करता हूं

unset($_COOKIE['hello']);

मैं फ़ायरफ़ॉक्स से अपने कुकी ब्राउज़र में देखता हूं कि कुकी अभी भी मौजूद है। मैं वास्तव में कुकी को कैसे निकाल सकता हूं?


आप पा सकते हैं $cookie->delete()से github.com/delight-im/PHP-Cookie उपयोगी। प्रश्न से कोड बस उस संपत्ति को हटा देता है जिसे सर्वर-साइड पर पार्स किया गया है। कुकी अभी भी क्लाइंट की तरफ रहेगी।
कौवा

जवाबों:


280

आप यह कोशिश कर सकते हैं

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}

141
मैं समझता हूं कि यह एक उदाहरण है, लेकिन कृपया कभी भी कुकीज़ में उपयोगकर्ता नाम या पासवर्ड को संग्रहीत न करें।
तमस

3
यह व्यर्थ है unset($_COOKIE['Hello']);। यदि आप इसे हटाते हैं तो यह कुछ भी नहीं बदलता है।
machineaddict

30
@machineaddict unset($_COOKIE['Hello']);वास्तव में महत्वपूर्ण है यदि आप कोड में बाद में कहीं कुकी की जांच कर सकते हैं।
एंड्रियास हॉल्टग्रेन

4
ठीक काम लेकिन जब पृष्ठ पुनः लोड करने का प्रयास करें। यह देखा क्यों पुराने डेटा के साथ कुकी सेट ?.
नीलेश ने

9
======= CHROME में काम नहीं करता है ======= मैंने आज इस कोड की कोशिश की और जब मैं Google क्रोम का उपयोग करके साइट तक पहुंचता हूं, और फिर क्रोम में डेवलपर टूल में जाता हूं, तो मैं देख सकता हूं कि समाप्ति समय युग से पहले 1 सेकंड के लिए सेट किया गया है (जैसे 1969-12-31 23:59:59) लेकिन जब मैं अगली बार पृष्ठ सबमिट करता हूं तो कुकी सर्वर पर सबमिट की जाती है। जब मैंने निम्नलिखित कमांड देने के लिए -1 से 1 (जैसे 1970-01-01 00:00:01) को बदल दिया: setcookie ('हैलो', अशक्त, 1, '/'); तब क्रोम ने उम्मीद के मुताबिक काम किया और कुकी को जमा नहीं किया
पीटर हिंड्स

284

मान को "" और समाप्ति की तारीख को कल (या अतीत में किसी भी तारीख) पर सेट करें

setcookie("hello", "", time()-3600);

फिर अगली बार जब पृष्ठ लोड होगा तो कुकी समाप्त हो जाएगी।


10
कैसे 0 (युग) के लिए समय निर्धारित करने के बारे में? =]
स्ट्रैजर

12
यदि आप अतीत में बहुत दूर की तारीख रखते हैं, तो IE इसे छाल देगा और इसे igores कर देगा, अर्थात मान हटाया नहीं जाएगा।
जुलिएन

52
@strager मैनुअल में कहा गया है: यदि 0 पर सेट किया गया है, या छोड़ा गया है, तो कुकी सत्र के अंत में समाप्त हो जाएगी (जब ब्राउज़र बंद हो जाता है)। यह वास्तव में कुकी को हटाना नहीं है। मैं वास्तव में नहीं जानता कि क्या IE जूलियन ने कहा कि क्या करेगा, लेकिन यह संभव से अधिक है कि IE कुछ अजीब करेगा।
यनीस

31
इसके अलावा, वास्तव में परेशान न करें ($ _ COOKIE ["हैलो"]), क्योंकि अगर बाकी पेज पर कोड है जो $ _COOKIE ["हैलो"] को देखता है, तो भी यह इसे सेट कर देगा। मैं बस इस एक के द्वारा बिट गया।
मैगमैटिक

12
साथ ही यह रास्ता तय करने के लिए एक अच्छा विचार है, इसलिए सेटकुकी ('हैलो', '', समय () - 3600, '/');
Stephan Weinhold

226

कुकी को हटाने का एक साफ तरीका $_COOKIEमूल्य और ब्राउज़र कुकी फ़ाइल दोनों को साफ़ करना है :

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}

3
यह सबसे अच्छी विधि है, क्योंकि आपको पृष्ठ को ताज़ा करने की आवश्यकता नहीं है!
मैक्सवी

19
मैं पेज को नीचे करता रहता हूं और उत्तर बेहतर, मजेदार होते रहते हैं। लेकिन यह सबसे अच्छा है, यहां देखना बंद करो।
एंड्रयू

23
FYI करें, यदि आप कुकी को पथ का उपयोग करते हुए सेट करते हैं, तो आपको इस setcookieकॉल में पथ को भी शामिल करना होगा :setcookie('key', '', time() - 3600, '/');
Gavin

1
@ गेविन उस टिप के लिए धन्यवाद। मैं सोच रहा था कि यह क्यों नहीं हटाया जा रहा है, लेकिन unsettingसफलतापूर्वक था ।
stinkysGTI

1
किसी के लिए भी जो कुकी के अस्तित्व की जाँच कर रहा है और कुकीज़ के बारे में परवाह करता है जो nullमूल्यों के साथ मौजूद हैं, आपको इसके बजाय array_key_exists () का उपयोग करने की आवश्यकता होगी , क्योंकि एक nullमूल्य वाला कुकी isset()चेक द्वारा नहीं मिलेगा ।
लीथ

27

मज़बूती से एक कुकी को हटाने के लिए इसे अपने PHP सर्वर द्वारा गणना के रूप में अतीत में कभी भी समाप्त करने के लिए इसे सेट करने के लिए पर्याप्त नहीं है। ऐसा इसलिए होता है क्योंकि क्लाइंट कंप्यूटर कई बार ऐसा कर सकते हैं जो आपके सर्वर से भिन्न होते हैं।

सबसे अच्छा अभ्यास एक खाली कुकी के साथ वर्तमान कुकी को अधिलेखित करना है जो भविष्य में एक सेकंड के बाद (1 जनवरी 1970 00:00:00 यूटीसी) के बाद समाप्त हो रहा है:

setcookie("hello", "", 1);

13
मुझे सही है अगर मैं गलत हूँ, लेकिन "1" करने के लिए कि यह युग के बाद एक दूसरे के लिए सेट होगा, भविष्य में एक सेकंड नहीं ..? मेरा मानना ​​है कि आप समय क्षेत्र के अंतर के बारे में सही हैं, लेकिन सबसे अच्छा समाधान यह होगा कि इसे 2 दिन पहले ही सेट कर दिया जाए (इसलिए दूर का टाइम टाइम जोन अभी भी कुकी को परेशान नहीं करेगा)।
पॉलस्किनर

@PaSSkinner युग की तारीख समय क्षेत्रों से स्वतंत्र है, कंप्यूटर आपके लिए यह गणना करता है।
एलेक्सर

3
@AlexR हाँ। वास्तव में मेरी बात का जवाब नहीं है। मेरी समझ से, उपरोक्त कोड कुकी को अतीत में समाप्त करने के लिए सेट करता है (जब तक कि एक दूसरा अतीत), जब तक कि मुझसे गलती न हो।
पॉलस्किनर

@PaulSkinner बेशक, आपकी टिप्पणी के बाकी पूरी तरह से ठीक है।
एलेक्सआर

9
"1" के लिए +1। मुझे समझ में नहीं आता है कि क्यों एक समय में ठीक एक घंटे पहले हटाए गए कुकी को सेट करने के लिए अन्य सभी को ठीक किया जाता है।
Meisner

20

यह आपके कोड में कुकी को परेशान करेगा, लेकिन चूंकि प्रत्येक अनुरोध पर $ _COOKIE चर ताज़ा किया जाता है, इसलिए यह अगले पृष्ठ के अनुरोध पर वापस आ जाएगा।

वास्तव में कुकी से छुटकारा पाने के लिए, समाप्ति तिथि निर्धारित करें:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);

1
क्या unset()कुकी को कोई ज़रूरत नहीं है ?
प्रातः

2
@PratikCJoshi केवल यदि आपका कोड बाद में इसके लिए दिखता है।
अल्फामाइकेलियम

14

मुझे अपने कोड में एक ही समस्या थी और पाया कि यह एक कुकी पथ मुद्दा था। इस स्टैक ओवरफ्लो पोस्ट की जाँच करें: php सेट कुकी को हटा नहीं सकते

मैंने कुकी को "/" के पथ मान का उपयोग करके सेट किया था, लेकिन जब मैंने इसे खाली करने का प्रयास किया, तो इसका कोई भी मार्ग मूल्य नहीं था, इसलिए यह स्पष्ट नहीं था। तो यहाँ एक उदाहरण है कि क्या काम किया है:

कुकी की स्थापना:

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);

कुकी साफ़ करना:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

उम्मीद है की वो मदद करदे।



7

PHP डॉक्स से " उदाहरण # 2 setcookie () हटाएँ उदाहरण " लेबल देखें । ब्राउज़र से एक कुकी को साफ़ करने के लिए, आपको ब्राउज़र को यह बताना होगा कि कुकी समाप्त हो गई है ... ब्राउज़र तब इसे हटा देगा। unsetजैसा कि आपने इस्तेमाल किया है, यह सिर्फ कोको हेल को हटाता है 'कुकी' सरणी से।


7

जब आप करते हैं तो यह PHP v7 सेटकुकी () कोड काम करता है:

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

पोर्ट 80 पर सूँघते समय tcpdump के आउटपुट से, सर्वर क्लाइंट (ब्राउज़र) को निम्न हेडर भेजता है:

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

निम्नलिखित अनुरोधों में पैकेट का अवलोकन करना ब्राउज़र अब हेडर में इन कुकीज़ को नहीं भेजता है


4

कुकी को हटाने के लिए आपको केवल NULL को मान सेट करना होगा:

"यदि आपने समाप्ति समय, पथ या डोमेन के लिए नोन्डफॉल्ट मानों के साथ एक कुकी सेट की है, तो आपको कुकी को ठीक से हटाने के लिए कुकी को हटाते समय फिर से उन्हीं मूल्यों को प्रदान करना होगा।" "लर्निंग PHP5" पुस्तक से उद्धरण।

तो इस कोड को काम करना चाहिए (मेरे लिए काम करता है):

कुकी की स्थापना: setcookie('foo', 'bar', time() + 60 * 5);

कुकी को हटाना: setcookie('foo', '', time() + 60 * 5);

लेकिन मैंने देखा कि हर कोई एक्सपायरी डेट को पहले से निर्धारित कर रहा है, क्या यह आवश्यक है, और क्यों?


1
यह विश्वसनीय है, इसीलिए। बोर्ड में काम करने के लिए कुछ भी नहीं है और अतीत में एक समय (लेकिन बहुत दूर नहीं के रूप में IE कभी-कभी इसे पसंद नहीं करता है) से मान सेट करने का एक संयोजन।
पॉलस्किनर

खाली स्ट्रिंग के ''रूप में एक ही बात नहीं है null
18

3

आपके द्वारा लिखी जा सकने वाली सभी कुकी हटाने के लिए:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}

3
यह वास्तव में कुकीज़ को तब तक नहीं हटाएगा, जब तक कि उनके पास एक ही पथ और डोमेन सेटिंग्स नहीं हैं, जैसे कि सेटकॉकी के लिए चूक।
नोहे

2

यदि आप कुकी को "हटाना" चाहते हैं, तो बस समाप्ति तिथि को एक घंटे पहले सेट करें:

setcookie ("TestCookie", "", time() - 3600);

या

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

स्रोत: http://www.php.net/manual/en/function.setcookie.php

आपको filter_input()सभी ग्लोबल्स के लिए फ़ंक्शन का उपयोग करना चाहिए जो एक आगंतुक इस तरह से दर्ज / हेरफेर कर सकता है:

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: http://www.php.net/manual/en/function.filter-input.php और यहाँ: http://www.w3schools.com/php/func_filter_input.asp


2

मुझे पता है कि इस विषय को बनाए हुए एक लंबा समय हो गया है, लेकिन मैंने इस समाधान के भीतर थोड़ी सी गलती देखी (मैं इसे इस तरह कह सकता हूं, क्योंकि यह एक विस्तार है)। मैं मानता हूँ कि बेहतर समाधान शायद यही समाधान है:

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

लेकिन, वर्तमान स्थिति में, आप हर मामले में कुकीज़ को हटा देते हैं, जहाँ unset फंक्शन काम करता है और तुरंत ही आप नई एक्सपायर्ड कुकीज़ बनाते हैं, ताकि unset फंक्शन काम न करे।

इसका मतलब है कि भले ही अनसेट फ़ंक्शन काम करता है, फिर भी यह कंप्यूटर पर 2 कुकीज़ होगा। तार्किक दृष्टिकोण में, पूछा गया लक्ष्य कुकीज़ को हटाना है यदि यह संभव है और यदि यह वास्तव में नहीं है, तो इसे समाप्त करें; "सबसे साफ" परिणाम प्राप्त करने के लिए।

इसलिए, मुझे लगता है कि हमें बेहतर करना चाहिए:

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

धन्यवाद और आपका दिन शुभ हो :)


PHP के तर्क के लिए फंक्शन अनसेट का मतलब होता है (यदि आप वेरिएबल $ _COOKIE ['हेलो'] का उपयोग करना चाहते हैं, तो आप ऐसा नहीं कर सकते क्योंकि यह अनसेट है)। और फंक्शन सेटकुकी नाविक के लिए है। 2 अलग-अलग उद्देश्य, कार्यों के क्रम का वास्तविक कोड पर कोई प्रभाव नहीं पड़ता है।
कालजेम

वास्तव में, मुझे पता है कि यह हां है, लेकिन अगर आप पूरी तरह से सुनिश्चित करना चाहते हैं कि कुकी अनसेट / डिलीट हो गई है और इसलिए आप दो समाधानों का सही उपयोग करते हैं, तो यह पहले theses expire करने के लिए क्लीनर होगा और उसके बाद unes theses और unset theses फिर एक समय सीमा समाप्त कुकी को पुनः बनाएँ ... यदि आप देखें कि मेरा क्या मतलब है?
ग्रेग

हाँ, अभी जवाब देने के लिए खेद है :) मैंने इसे भेजा है क्योंकि मैंने लोगों को इसे दूसरे तरीके से करते देखा था .. लेकिन यह उस तरह अधिक चतुर लगता है, मुझे लगता है।
ग्रेग

2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.

2

यदि आप अपने सभी मौजूदा डोमेन से कुकी को पूरी तरह से हटाना चाहते हैं तो निम्न कोड निश्चित रूप से आपकी मदद करेगा।

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

यह कोड कुकी चर को आपके सभी डोमेन से पूरी तरह से हटा देगा; "/" - यह दर्शाता है कि कुकी चर का मान सभी डोमेन के लिए सेट है न केवल वर्तमान डोमेन या पथ के लिए। समय () - 300 यह दर्शाता है कि यह पिछली बार सेट होता है इसलिए यह समाप्त हो जाएगा।

यह कैसे पूरी तरह से हटा दिया जाता है।


1

आप कुकी मानों के आधार पर एक सत्र चर सेट कर सकते हैं

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");

1

आप बस इस अनुकूलित फ़ंक्शन का उपयोग कर सकते हैं:

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

यदि आप $ _COOKIE ['user_account'] को हटाना चाहते हैं।
महज प्रयोग करें:

unset_cookie('user_account');

1

यह आसान है!

setcookie("cookiename", "cookievalue", 1);

इसे हटाने वाली कुकी के लिए मान सेट करने की आवश्यकता नहीं है!
आमिर फ़ॉ

1

जब आप 0समय के लिए प्रवेश करते हैं, तो आप ब्राउज़र के लिए "अब" (+ अब से वास्तव में अब है) का मतलब है और यह कुकी को हटा देता है।

setcookie("key", NULL, 0, "/");

मैंने इसे क्रोम ब्राउजर में चेक किया जो मुझे देता है:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM

नहीं, बस डॉक्स पढ़ें। "यदि 0 पर सेट किया गया है या छोड़ा गया है, तो कुकी सत्र के अंत में समाप्त हो जाएगी (जब ब्राउज़र बंद हो जाता है)।"
DrLightman

@DrLightman आपकी उपस्थिति के लिए धन्यवाद, क्या आप कृपया दस्तावेज़ का हवाला दे सकते हैं?
अमीर फेन

function.setcookie.php , पैरामीटर को समाप्त करता है। "यदि 0 पर सेट किया गया है या छोड़ा गया है, तो कुकी सत्र के अंत में समाप्त हो जाएगी (जब ब्राउज़र बंद हो जाता है)।"
DrLightman

1

बस falseइसे अनसेट करने के लिए कुकी का मान सेट करें ,

setcookie('cookiename', false);

PS: - यह सबसे आसान तरीका है।


-1

आपको अपने सर्वर में php के साथ कुकीज़ को हटाना है और अपने ब्राउज़र के लिए js के साथ .. (उन्होंने php के साथ बनाया है, लेकिन कुकी फ़ाइलें ब्राउज़र क्लाइंट में भी हैं):

एक उदाहरण:

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);

कुकी मान को सेट / हटाने के लिए आपको जावास्क्रिप्ट की आवश्यकता नहीं है। Php function setcookie आपके लिए php.net/manual/en/function.setcookie.php
माइकल खलीली

-5

आप में से अधिकांश यह भूल रहे हैं कि यह केवल एक स्थानीय मशीन पर काम करेगा। एक डोमेन पर आपको इस उदाहरण की तरह एक पैटर्न की आवश्यकता होगी।

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);

1
यदि यह छोड़ा गया है तो डोमेन पैरामीटर का अर्थ वर्तमान डोमेन होगा।
डस्टवॉल्फ

मेरा कहने का मतलब था कि आपका जवाब गलत है। यह किसी भी डोमेन के लिए काम करेगा, न कि केवल स्थानीय मशीन के रूप में, यह स्वचालित रूप से वर्तमान डोमेन का उपयोग करेगा। और आपकी टिप्पणी का मतलब है कि आप नाराज हैं या कुछ और?
डस्टवॉल्फ

क्या आप उस पाठ को भी पढ़ रहे हैं जो कोड के ऊपर है? मुझे रोकना, मैं काम कर रहा हूं। मैं यू के साथ बात कर रहा हूँ।
पीटर ग्रुपेलाकर

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

तो अगर हर कोई कहता है, यही मामला है ... तो मेरे जवाब में कुछ स्पष्ट रूप से गलत होना चाहिए ... इस पोस्ट में जिस fct टोपी को इंगित किया गया है वह कोई फर्क नहीं पड़ता? ... यू केवल दिशा निर्देश के कुछ प्रकार चाहते हैं? , और किसी भी वैश्विक उपयोगकर्ताओं को अनदेखा करें जो एक simular स्थिति पर काम कर रहे हैं ... मैं इसे प्राप्त करता हूं ... मुझे गुस्सा करना बंद करो, मेरा जवाब गलत नहीं है।
पीटर Gruppelaar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.