Supprimer un cookie


260

Lorsque je souhaite supprimer un cookie, j'essaie

unset($_COOKIE['hello']);

Je vois dans mon navigateur de cookies de Firefox que le cookie existe toujours. Comment puis-je vraiment supprimer le cookie?


Vous pouvez trouver $cookie->delete()sur github.com/delight-im/PHP-Cookie utile. Le code de la question supprime simplement la propriété qui a été analysée côté serveur. Le cookie continuera de vivre côté client.
caw

Réponses:


280

Vous pouvez essayer ceci

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

141
Je comprends qu'il s'agit d'un exemple, mais veuillez ne jamais stocker de nom d'utilisateur ou de mot de passe dans des cookies.
tamasd

3
C'est inutile unset($_COOKIE['Hello']);. Cela ne change rien si vous le supprimez.
machineaddict

30
@machineaddict unset($_COOKIE['Hello']);est en fait important si vous pouvez vérifier le cookie quelque part plus tard dans le code.
Andreas Hultgren

4
fonctionne bien mais quand essayez de recharger la page. il a vu des cookies avec d'anciennes données pourquoi?.
Nilesh patel

9
======= NE FONCTIONNE PAS DANS CHROME ======= J'ai essayé ce code aujourd'hui et lorsque j'accède au site à l'aide de Google Chrome, puis que j'entre dans les outils de développement dans Chrome, je peux voir que le délai d'expiration est défini sur 1 seconde avant l'époque (par exemple, 1969-12-31 23:59:59), mais lorsque je soumets la page suivante, le cookie est soumis au serveur. Lorsque j'ai changé le -1 en 1 (par exemple 1970-01-01 00:00:01) pour donner la commande suivante: setcookie ('Hello', null, 1, '/'); puis chrome a agi comme prévu et n'a pas soumis le cookie
Peter Hinds

284

Définissez la valeur sur "" et la date d'expiration sur hier (ou toute date antérieure)

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

Ensuite, le cookie expirera lors du prochain chargement de la page.


10
Que diriez-vous de régler l'heure à 0 (l'époque)? =]
strager

12
Si vous placez une date trop loin dans le passé, IE l'aboie et l'ignore, c'est-à-dire que la valeur ne sera pas supprimée.
Julien

52
@strager Le manuel indique: s'il est défini sur 0 ou omis, le cookie expirera à la fin de la session (à la fermeture du navigateur). Cela ne supprime pas vraiment le cookie. Je ne sais vraiment pas si IE fera ce que Julien a dit, mais il est plus que possible qu'IE fera quelque chose d'étrange.
yannis

31
N'oubliez pas non plus de réellement désactiver ($ _ COOKIE ["hello"]), car s'il y a du code sur le reste de la page qui regarde $ _COOKIE ["hello"], il le trouvera toujours défini. Je viens de mordre par celui-ci.
Magmatic

12
De plus, c'est une bonne idée de définir le chemin, donc setcookie ('hello', '', time () - 3600, '/');
Stephan Weinhold

227

Une façon propre de supprimer un cookie consiste à effacer à la fois la $_COOKIEvaleur et le fichier de cookie du navigateur:

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

3
C'est la meilleure méthode, car vous n'avez pas besoin de rafraîchir la page!
MaxV

19
Je continue de descendre la page et les réponses s'améliorent, drôle. Mais c'est le meilleur, arrêtez de chercher ici.
Andrew

23
Pour info, si vous définissez le cookie en utilisant un chemin, vous devrez également inclure le chemin dans cet setcookieappel:setcookie('key', '', time() - 3600, '/');
Gavin

1
@Gavin Merci pour cette astuce. Je me demandais pourquoi il ne supprimait pas, mais unsettingavec succès.
stinkysGTI

1
Pour toute personne qui vérifie l'existence d'un cookie et se soucie des cookies qui existent avec des nullvaleurs, vous devrez utiliser array_key_exists () à la place, car un cookie avec une nullvaleur ne sera pas trouvé par une isset()vérification.
Leith

27

Pour supprimer un cookie de manière fiable, il ne suffit pas de le configurer pour qu'il expire à tout moment dans le passé, tel que calculé par votre serveur PHP. En effet, les ordinateurs clients peuvent et ont souvent des heures différentes de celles de votre serveur.

La meilleure pratique consiste à remplacer le cookie actuel par un cookie vierge qui expire une seconde dans le futur après l'époque (1er janvier 1970 00:00:00 UTC), comme suit:

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

13
Corrigez-moi si je me trompe, mais le régler sur "1" le mettrait à une seconde après l'époque, pas une seconde à l'avenir ..? Je pense que vous avez raison sur les différences de fuseau horaire, donc la meilleure solution serait de le régler sur 2 jours dans le passé (donc même le fuseau horaire le plus éloigné effacerait toujours le cookie).
PaulSkinner

@PaulSkinner la date de l'époque est indépendante des fuseaux horaires, l'ordinateur fait ce calcul pour vous.
AlexR

3
@AlexR Oui. Ne répond pas vraiment à mon argument. À ma connaissance, le code ci - dessus définit le cookie pour expirer dans le passé (une seconde après l'époque), sauf erreur de ma part.
PaulSkinner

@PaulSkinner bien sûr, le reste de votre commentaire est parfaitement bien.
AlexR

9
+1 pour le "1". Je ne comprends pas pourquoi tous les autres sont si déterminés à définir un cookie supprimé exactement une heure dans le passé.
Meisner

20

Cela supprimera le cookie dans votre code, mais comme la variable $ _COOKIE est actualisée à chaque demande, elle reviendra simplement à la demande de page suivante.

Pour supprimer le cookie, définissez la date d'expiration dans le passé:

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

1
Le unset()cookie n'est-il pas nécessaire ?
Pratik

2
@PratikCJoshi Uniquement si votre code le recherche plus tard.
AlphaMycelium

14

J'ai eu le même problème dans mon code et j'ai constaté qu'il s'agissait d'un problème de chemin d'accès aux cookies. Consultez ce message de débordement de pile: impossible de supprimer le cookie de jeu php

J'avais défini le cookie en utilisant une valeur de chemin d'accès "/", mais je n'avais aucune valeur de chemin d'accès lorsque j'essayais de l'effacer, donc il ne s'est pas effacé. Voici donc un exemple de ce qui a fonctionné:

Définition du cookie:

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

Effacer le cookie:

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

J'espère que cela pourra aider.



7

Voir l'exemple intitulé " Exemple # 2 exemple de suppression de setcookie () " dans la documentation PHP. Pour effacer un cookie du navigateur, vous devez informer le navigateur que le cookie a expiré ... le navigateur le supprimera ensuite. unsetcomme vous l'avez utilisé, il supprime simplement le cookie «bonjour» du tableau COOKIE.


7

Voici comment fonctionne le code PHP v7 setcookie ():

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

À partir de la sortie de tcpdump en reniflant sur le port 80, le serveur envoie au client (navigateur) les en-têtes HTTP suivants:

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

En observant les paquets dans les requêtes suivantes, le navigateur n'envoie plus ces cookies dans les en-têtes


4

Pour supprimer le cookie, il vous suffit de définir la valeur sur NULL:

"Si vous avez défini un cookie avec des valeurs non par défaut pour un délai d'expiration, un chemin ou un domaine, vous devez fournir à nouveau ces mêmes valeurs lorsque vous supprimez le cookie pour que le cookie soit supprimé correctement." Citation du livre "Learning PHP5".

Donc, ce code devrait fonctionner (fonctionne pour moi):

Définition du cookie: setcookie('foo', 'bar', time() + 60 * 5);

Suppression du cookie: setcookie('foo', '', time() + 60 * 5);

Mais j'ai remarqué que tout le monde fixait la date d'expiration au passé, est-ce nécessaire et pourquoi?


1
C'est fiable, c'est pourquoi. Une combinaison de la définition de la valeur à rien et d'un temps dans le passé (mais pas trop loin car IE ne l'aime pas parfois trop loin de ce que j'ai lu) fonctionne à tous les niveaux.
PaulSkinner

La chaîne vide ''n'est pas la même chose que null.
orev

3

Pour supprimer tous les cookies, vous pouvez écrire:

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

3
Cela ne supprimera pas réellement les cookies, sauf s'ils ont le même chemin d'accès et les mêmes paramètres de domaine que les valeurs par défaut de setcookie.
Noishe

2

Définissez simplement la date d'expiration sur une heure, si vous souhaitez "supprimer" le cookie, comme ceci:

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

ou

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

Source: http://www.php.net/manual/en/function.setcookie.php

Vous devez utiliser la filter_input()fonction pour tous les globaux qu'un visiteur peut entrer / manipuler, comme ceci:

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

Vous pouvez en savoir plus à ce sujet ici: http://www.php.net/manual/en/function.filter-input.php et ici: http://www.w3schools.com/php/func_filter_input.asp


2

Je sais qu'il y a longtemps que ce sujet n'a pas été créé mais j'ai vu une petite erreur dans cette solution (je peux l'appeler comme ça, car c'est un détail). Je suis d'accord que la meilleure solution est probablement cette solution:

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

Mais, dans le cas présent, vous supprimez les cookies dans tous les cas où la fonction non définie fonctionne et vous créez immédiatement de nouveaux cookies expirés au cas où la fonction non définie ne fonctionnerait pas.

Cela signifie que même si la fonction non définie fonctionne, elle contiendra toujours 2 cookies sur l'ordinateur. L'objectif demandé, d'un point de vue logique, est de supprimer les cookies si cela est possible et si ce n'est vraiment pas le cas, de les faire expirer; pour obtenir le résultat "le plus propre".

Donc, je pense que nous devrions mieux faire:

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

Merci et bonne journée :)


La fonction unset est destinée à la logique de PHP (si vous voulez utiliser la variable $ _COOKIE ['Hello'], vous ne pouvez pas car elle est unset). Et la fonction setcookie est destinée au navigateur. 2 objectifs différents, l'ordre des fonctions n'a aucun impact sur le code réel.
Kalzem

En fait, je le savais, mais si vous voulez absolument être sûr que le cookie a été désactivé / supprimé et que vous utilisez les deux solutions tout de suite, il serait plus propre avant de faire expirer les thèses, puis de supprimer les thèses que de supprimer les thèses et puis recréez un cookie expiré ... si vous voyez ce que je veux dire?
Greg

Oui, désolé de répondre tout à l'heure :) Je l'ai envoyé parce que j'avais vu des gens le faire de l'autre manière .. mais ça semble plus intelligent comme ça, je pense.
Greg

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

Si vous souhaitez supprimer complètement le cookie de tout votre domaine actuel, le code suivant vous aidera certainement.

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

Ce code supprimera complètement la variable cookie de tout votre domaine, c'est-à-dire; "/" - il indique que la valeur de la variable de cookie est définie pour tout le domaine et pas seulement pour le domaine ou le chemin actuel. time () - 300 indique qu'il est défini sur une heure précédente, il expirera donc.

Voilà comment il est parfaitement supprimé.


1

Vous pouvez définir une variable de session basée sur les valeurs des cookies

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

Vous pouvez simplement utiliser cette fonction de personnalisation:

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

Si vous souhaitez supprimer $ _COOKIE ['user_account'].
Utilisez simplement:

unset_cookie('user_account');

1

C'est simple!

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

Il n'est pas nécessaire de définir la valeur d'un cookie de suppression!
Amir Fo

1

Lorsque vous entrez 0pour le temps, vous voulez dire "maintenant" (+ 0 à partir de maintenant est en fait maintenant) pour le navigateur et il supprime le cookie.

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

Je l'ai vérifié dans le navigateur Chrome qui me donne:

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

Non. Il suffit de lire les documents. "S'il est défini sur 0 ou omis, le cookie expirera à la fin de la session (à la fermeture du navigateur)."
DrLightman

@DrLightman Merci de votre présence. Pouvez-vous citer la documentation?
Amir Fo

function.setcookie.php , expire le paramètre. "S'il est défini sur 0 ou omis, le cookie expirera à la fin de la session (à la fermeture du navigateur)."
DrLightman

1

Définissez simplement la valeur du cookie falsepour le désactiver,

setcookie('cookiename', false);

PS: - C'est la façon la plus simple de le faire.


-1

Vous devez supprimer les cookies avec php dans votre serveur et aussi avec js pour votre navigateur .. (Ils l'ont fait avec php, mais les fichiers cookies sont également dans le client du navigateur):

Un exemple:

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']);

Vous n'avez pas besoin de JavaScript pour définir / supprimer la valeur du cookie. La fonction php setcookie le fera pour vous php.net/manual/en/function.setcookie.php
Michael Khalili

-5

La plupart d'entre vous oublient que cela ne fonctionnera que sur une machine locale. Sur un domaine, vous aurez besoin d'un modèle comme cet exemple.

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

1
Le paramètre de domaine signifiera le domaine actuel s'il est omis.
DustWolf

Je voulais dire que votre réponse est incorrecte. Il fonctionnera pour n'importe quel domaine, pas seulement pour la machine locale, car il utilisera automatiquement le domaine actuel. Et votre commentaire veut dire que vous êtes offensé ou quelque chose?
DustWolf

Lisez-vous même le texte qui est suffisamment au-dessus du code? arrête de m'embêter, je travaille. j'ai fini de parler avec u.
Peter Gruppelaar

Je ne comprends pas pourquoi vous vous fâchez contre les autres utilisateurs s'ils signalent une erreur dans votre réponse. setcookiefonctionne pour n'importe quel domaine, qu'il soit localhost ou non.
xorinzor

Donc, si tout le monde dit que c'est le cas ... alors il doit y avoir quelque chose qui ne va manifestement pas dans ma réponse ... le chapeau fct qui a été souligné dans ce post n'a pas d'importance? ... vous voulez seulement une sorte de réponse , et ignorez tous les utilisateurs mondiaux qui travaillent sur une situation similaire ... je comprends ... arrêtez de m'embêter, ma réponse n'est pas fausse.
Peter Gruppelaar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.