কীভাবে আমার ওয়েবসাইটের সমস্ত কুকিজ পিএইচপি-তে মুছবেন


93

আমি ভাবছি যখন কোনও ব্যবহারকারী লগআউট ক্লিক করে আমি আমার ওয়েবসাইটের সমস্ত কুকিজ মুছতে পারি কিনা, কারণ আমি কুকি মুছতে এটি ফাংশন হিসাবে ব্যবহার করেছি তবে এটি সঠিকভাবে কাজ করছে না:

setcookie("user",false);

পিএইচপি-তে কোনও ডোমেনের কুকিজ মুছার উপায় আছে?


বেশিরভাগ ক্ষেত্রে, কুকিগুলি আরও বিজ্ঞতার সাথে বেছে বেছে ব্যবহার করা আরও ভাল ধারণা। আপনি যদি সেশনগুলি ব্যবহার করেন তবে একটি কুকি যথেষ্ট হবে। যাইহোক, আপনি কোন কুকি সেট করেছেন তা ট্র্যাক করুন, তারপরে আপনার এগুলির পুনরাবৃত্তি এবং মুছে ফেলার কোনও গতিশীল উপায় প্রয়োজন হবে না।
কাও

উত্তর:


174

পিএইচপি সেটকুকি ()

এই পৃষ্ঠা থেকে নেওয়া, এটি আপনার ডোমেনের সমস্ত কুকি আনসেট করবে:

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

http://www.php.net/manual/en/function.setcookie.php#73484


9
আমি সেই মন্তব্যটি পড়েছি, তবে আমি সত্যিই পাই না কেন অ্যারের HTTP_COOKIEমাধ্যমে লুপিংয়ের চেয়ে মানটি ব্যবহার করা আরও ভাল $_COOKIE। আপনার কি কোনও কারণ আছে? আমার কাছে এটি পার্সারটির জন্য আরও বেশি (দ্বিগুণ) কাজের মতো দেখায়।
22-28

এখন পর্যন্ত কোনও পার্থক্য নেই আমি বলতে পারি (অতিরিক্ত কাজ বাদে)।
জেসনবার

11
@ পোক: যদি কুকির নাম অ্যারে স্বরলিপিতে থাকে, উদাহরণস্বরূপ: ব্যবহারকারী [ব্যবহারকারীর নাম] তাহলে পিএইচপি স্বয়ংক্রিয়ভাবে $ _COOKIE- তে একটি সম্পর্কিত অ্যারে তৈরি করবে। পরিবর্তে $ _SERVER ['HTTP_COOKIE'] ব্যবহার করুন কারণ এটি প্রকৃত HTTP অনুরোধ শিরোনামকে আয়না দেয়।
ফরহাদী

আপনি কীভাবে সেট মান সহ কোনও কুকিজ বা কুকিজ বাদে সমস্ত কুকিজ মুছবেন?
চিল ওয়েব ডিজাইন

4
আমি একই নামের সাথে দুটি কুকি থাকলেও বিভিন্ন ডোমেন সেটিংস সহ এমন পরিস্থিতি দেখেছি। তাদের মধ্যে একটি এটিকে $ _COOKIE অ্যারে তৈরি করবে এবং অন্যটি তা করবে না। তবে তারা উভয়ই HTTP_COOKIE এ দৃশ্যমান হবে। আপনি যদি এই পরিস্থিতিটি পরিষ্কার করতে চান তবে এটি করার উপায় এটি।
dlo

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

আরও ভাল মনে রাখা (বা এটি কোথাও সংরক্ষণ করে রাখা) কোন কুকি কোনও ডোমেনে আপনার অ্যাপ্লিকেশন সহ সেট করা আছে এবং সেগুলি সরাসরি মুছে ফেলা উচিত।
এইভাবে আপনি সমস্ত মান সঠিকভাবে মুছতে নিশ্চিত হতে পারেন।


4
দুর্দান্ত কোড, কিন্তু ব্যবহার করার জন্য কল্পনা করা হচ্ছে না setcookie( $key, FALSE );?! (নোট এ scetion দেখতে php.net/manual/en/function.setcookie.php )
মার্কো Demaio

@ মার্কো ডেমাইও: এটি হওয়া উচিত, তবে আমি দেখেছি যে কিছু সার্ভারে অতীতে ব্যর্থ হয়েছিল। তবে অবশ্যই, যদি এটি আপনার পক্ষে কাজ করে তবে কেবল এটির মতো করুন :)
26:41

এটি সার্ভারের বিষয় হওয়া উচিত নয়, এটি পিএইচপি যা এটি অভ্যন্তরীণভাবে করে। এবং /আপনি রাখা ফাইনাল প্রয়োজন কি setcookie?
মার্কো ডেমাইও

@ মার্কো ডেমাইও: হ্যাঁ, সার্ভারের সাথে আমি পিএইচপি সার্ভারকে বুঝিয়েছি। /কুকি পথ। আপনাকে এটি সেট করতে হবে যাতে আপনি ডোমেন থেকে কুকিগুলি সরিয়ে ফেলতে পারেন, অন্যথায় এটি বর্তমান পথে সেট করা আছে এবং কেবলমাত্র বর্তমান পাথের জন্য সেট করাগুলিকেই প্রভাবিত করে।
26:30

@ ট্রান্টে হাহ !? $ কী একটি অ্যারে নয়, এটি একটি কী।
অকর্মা

16

আমি উপরের কিছু উত্তরের সাথে একমত আমি কেবল "সময় () - 1000" এর পরিবর্তে "1" দিয়ে সুপারিশ করব। "1" এর মান মানে 1 লা জানুয়ারি 1970, যা সমাপ্তি 100% নিশ্চিত করে। অতএব:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');

4
আমি সর্বদা ভাবছিলাম যে কেন কেউ কেবল এটি করতে বলেন না, এবং আমি যে উত্তরটি খুঁজছি তা সদয়।
আনথার

সম্ভবত বর্তমানে কোনও সমস্যা নয়, তবে এক পর্যায়ে কিছু ব্রাউজার একটি তারিখ উপেক্ষা করেছে যা সমস্ত এক সাথে পুরানো ছিল এবং মানগুলি যেমনটি করা উচিত ততটুকু ফেলে দেওয়া হবে না। আমি বিশ্বাস করি IE 7 এটির একটি উদাহরণ।
কনরাড 10781

3

আপনার সাইটে কোনও আউটপুট ঘটানোর আগে আপনি আপনার সেটকুকি ফাংশনটিকে কল করেছেন তা নিশ্চিত করুন।

এছাড়াও, যদি আপনার ব্যবহারকারীগণ লগ আউট করে থাকেন তবে আপনার সেশন ভেরিয়েবলগুলি মুছে ফেলা / অবৈধ করা উচিত।


2

আপনি যখন আপনার কুকিজের নাম পরিবর্তন করেন, আপনি সমস্ত কুকিজ মুছতেও পারেন তবে একটি সংরক্ষণ করতে পারেন:

if (isset($_COOKIE)) {
    foreach($_COOKIE as $name => $value) {
        if ($name != "preservecookie") // Name of the cookie you want to preserve 
        {
            setcookie($name, '', 1); // Better use 1 to avoid time problems, like timezones
            setcookie($name, '', 1, '/');
        }
    }
}

এছাড়াও এই পিএইচপি-উত্তর উপর ভিত্তি করে


4
ভুল বাক্য গঠন: 1) ধারা 2 থাকলে কোনও AS কন্সট্রাক্ট নেই) "$ কুকিজ" এর সাথে CO _COOKIE
জেফ

2

প্রদত্ত উত্তরগুলি আমার সমস্যার সমাধান করেনি,

এটা করে নি:

  1. প্যারেন্ট ডোমেন কুকিজ অপসারণ (abc থেকে; বিসি; কুকিজ অপসারণ),
  2. অন্য কোনও মূলের থেকে আরও উচ্চতর পথ থেকে কুকিজ অপসারণ করুন।

আমার স্ক্রিপ্ট আছে, দেখুন।

<?php function unset_cookie($name)
{
    $host = $_SERVER['HTTP_HOST'];
    $domain = explode(':', $host)[0];

    $uri = $_SERVER['REQUEST_URI'];
    $uri = rtrim(explode('?', $uri)[0], '/');

    if ($uri && !filter_var('file://' . $uri, FILTER_VALIDATE_URL)) {
        throw new Exception('invalid uri: ' . $uri);
    }

    $parts = explode('/', $uri);

    $cookiePath = '';
    foreach ($parts as $part) {
        $cookiePath = '/'.ltrim($cookiePath.'/'.$part, '//');

        setcookie($name, '', 1, $cookiePath);

        $_domain = $domain;
        do {
            setcookie($name, '', 1, $cookiePath, $_domain);
        } while (strpos($_domain, '.') !== false && $_domain = substr($_domain, 1 + strpos($_domain, '.')));
    }
}

এটি সর্বাধিক সুন্দর / নিরাপদ / সর্বোত্তম সমাধান নয়, তাই আপনি যদি কেবল কুকি-পথ এবং / অথবা কুকি-ডোমেনের পরিচিত না হন তবে এটি ব্যবহার করুন। অথবা আপনার সংস্করণ তৈরি করতে আইডিয়াটি ব্যবহার করুন।


নিখুঁত সমাধান,
শাকিল আহমেদ

1

আপনার বিভিন্ন ট্র্যাকিং সরঞ্জাম সম্পর্কে সচেতন হওয়া উচিত যেমন গুগল অ্যানালিটিকাগুলি আপনার ডোমেনে কুকিগুলিও ব্যবহার করে এবং আপনি যদি জিএতে সঠিক ডেটা রাখতে চান তবে আপনি সেগুলি মুছতে চান না।

আমি কাজ করতে পারার একমাত্র সমাধান হ'ল বিদ্যমান কুকিজগুলি বাতিল করে দেওয়া। আমি ক্লায়েন্ট থেকে কুকি মুছতে পারিনি।

সুতরাং একটি ব্যবহারকারী লগ আউট করার জন্য আমি নিম্নলিখিত ব্যবহার:

setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);

অবশ্যই এটি সমস্ত কুকি মুছে দেয় না।


8
আমি কোনও কুকি ব্যবহারকারীর পাসওয়ার্ড সংরক্ষণ করার পরামর্শ দেব না। এটি একটি গুরুতর সুরক্ষা গর্ত, বিশেষত 0যুক্তি বিবেচনা করার অর্থ কুকি ট্রানজিটে এনক্রিপ্টও হয় না।
অ্যান্ড্রু এনসলে

1

পূর্ববর্তী সমস্ত উত্তরগুলি এড়িয়ে গেছে যে setcookieএকটি সুস্পষ্ট ডোমেন ব্যবহার করা যেতে পারে। তদুপরি, কুকিটি একটি উচ্চতর সাবডোমেনের উপর সেট করা থাকতে পারে, যেমন আপনি যদি কোনও foo.bar.tar.comডোমেইনে থাকেন তবে কোনও কুকি সেট আপ থাকতে পারে tar.com। অতএব, আপনি সমস্ত ডোমেনের জন্য কুকি আনসেট করতে চান যা সম্ভবত কুকি বাদ দিয়েছে:

$host = explode('.', $_SERVER['HTTP_HOST']);

while ($host) {
    $domain = '.' . implode('.', $host);

    foreach ($_COOKIE as $name => $value) {
        setcookie($name, '', 1, '/', $domain);
    }

    array_shift($host);
}

0

কুকিজ সাফ করতে ফাংশনটি ব্যবহার করুন:

function clearCookies($clearSession = false)
{
    $past = time() - 3600;
    if ($clearSession === false)
        $sessionId = session_id();
    foreach ($_COOKIE as $key => $value)
    {
        if ($clearSession !== false || $value !== $sessionId)
            setcookie($key, $value, $past, '/');
    }
}

যদি আপনি পাস করেন trueতবে এটি sessionডেটা সাফ করে, অন্যথায় সেশন ডেটা সংরক্ষণ করা হবে।


0

আমি জানি এই প্রশ্নটি পুরানো, তবে এটি একটি আরও সহজ বিকল্প:

header_remove();

কিন্তু সতর্কতা অবলম্বন করা আবশ্যক! ডক্সে বর্ণিত এটি কুকিজ, সেশন ইত্যাদি সহ সমস্ত শিরোনাম মুছে ফেলবে ।


এটি আসলে কুকিজ বা সেই ধারণার অনুরূপ কিছু মুছে ফেলতে আসলেই কিছু করতে পারে না কারণ ব্রাউজারটি কেবল কোনও সঞ্চিত কুকিজের মেয়াদ শেষ না হওয়া পর্যন্ত রাখে। যদিও অন্যান্য জিনিসগুলি কুকিজ উত্সাহিত করার চেষ্টা করে এবং তাদের এটি করা থেকে বিরত রাখে যদি তা সাহায্য করে।
My1

0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান এবং এটি ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলে ধরে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে। অনুগ্রহ করে কিছু ব্যাখ্যা যুক্ত করার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন you've
ম্যাক্সিমিলিয়ান পিটারস

0

দূরে না যাওয়া এমন কয়েকটি কুকি মুছে ফেলার জন্য আমাকে উপরের উত্তরে নিম্নলিখিতটি যুক্ত করতে হয়েছিল:

foreach($_COOKIE as $cook) {
    setcookie($cook, '', time()-1000);
    setcookie($cook, '', time()-1000, '/');
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.