Je me demande si je peux supprimer tous les cookies de mon site Web lorsqu'un utilisateur clique sur se déconnecter, car je l'utilisais comme fonction pour supprimer les cookies, mais cela ne fonctionnait pas correctement:
setcookie("user",false);
Est-il possible de supprimer les cookies d'un domaine en PHP?
Tiré de cette page, tous les cookies de votre domaine seront supprimés:
// 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, '/');
}
}
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
setcookie( $key, $value, $past, '/' );
}
Il est toutefois préférable de mémoriser (ou de le stocker quelque part) les cookies configurés avec votre application sur un domaine et de les supprimer tous directement.
De cette façon, vous pouvez être sûr de supprimer toutes les valeurs correctement.
Je suis d'accord avec certaines des réponses ci-dessus. Je recommanderais simplement de remplacer "time () - 1000" par "1". Une valeur de "1" signifie le 1er janvier 1970, ce qui garantit une expiration à 100%. Donc:
setcookie($name, '', 1);
setcookie($name, '', 1, '/');
assurez-vous d'appeler votre fonction setcookie avant toute sortie sur votre site.
de plus, si vos utilisateurs se déconnectent, vous devez également supprimer/invalider leurs variables de session.
Lorsque vous modifiez le nom de vos cookies, vous pouvez également supprimer tous les cookies mais en conserver un:
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, '/');
}
}
}
Aussi basé sur ceci PHP-Answer
Je sais que cette question est ancienne, mais c'est une alternative beaucoup plus facile:
header_remove();
Mais fais attention! Il effacera TOUS les en-têtes, y compris les cookies, les sessions, etc., comme expliqué dans la documentation .
Les réponses fournies n'ont pas résolu mon problème,
Il n'a pas:
Mon script fait, voir.
<?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, '.')));
}
}
Ce n'est pas la solution la plus jolie/sûre/optimale, utilisez-la uniquement si vous ne connaissez pas le cookie-path et/ou le cookie-domain. Ou utilisez cette idée pour créer votre version.
Vous devez savoir que divers outils de suivi, tels que Google Analytics, utilisent également des cookies sur votre domaine et vous ne souhaitez pas les supprimer, si vous souhaitez que les données soient correctes dans GA.
La seule solution que je pouvais utiliser consistait à définir les cookies existants sur null. Je ne pouvais pas supprimer les cookies du client.
Donc, pour déconnecter un utilisateur, j'utilise les éléments suivants:
setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);
Bien sûr, cela ne supprime pas TOUS les cookies.
Utilisez la fonction pour effacer les cookies:
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, '/');
}
}
Si vous passez true
, les données session
sont effacées, sinon les données de session sont préservées.
Toutes les réponses précédentes ont oublié que la variable setcookie
aurait pu être utilisée avec un domaine explicite. En outre, le cookie pourrait avoir été défini sur un sous-domaine plus élevé, par exemple. si vous étiez sur un domaine foo.bar.tar.com
, un cookie pourrait être défini sur tar.com
. Par conséquent, vous souhaitez désactiver les cookies pour tous les domaines susceptibles d'avoir abandonné le cookie:
$Host = explode('.', $_SERVER['HTTP_Host']);
while ($Host) {
$domain = '.' . implode('.', $Host);
foreach ($_COOKIE as $name => $value) {
setcookie($name, '', 1, '/', $domain);
}
array_shift($Host);
}