PHP: Cookie löschen funktioniert nicht
Guten Abend,
ich habe gerade ein Problem mit meinem Cookie: Ein Cookie soll bestimmte Daten speichern, wenn man aber einen Link aufruft soll darin der Cookie gelöscht werden. Eigentlich ganz einfach:
setcookie("Cookie", time()-360, "/");
Nur wenn ich den Cookie danach abfrage ist er plötzlich mit den Werten wieder da - wenn ich mir das genauer anschaue stimmt das sogar, der cookie wird nicht gelöscht!
$_COOKIE['Cookie'] = "";
hilft nur temporär - das heißt, in dem Script ist das Cookie leer, doch bei erneutem Laden ist er wieder da - warum?
Gibt es alternativen?
2 Antworten
Ehm, wenn dann so:
setcookie("Cookie", "wert", time()-360, "/");
siehe PHP Manual:
bool setcookie ( string $name [, string $value [, int $expire=0 [, string $path [, string $domain [, bool $secure=false [, bool $httponly=false ]]]]]] )
Warum möchtest du die Cookies denn überhaupt löschen? Benutzt du keine Sessions?
Ich möchte, dass diese Daten auch nach dem Ablauf der Session erhalten bleiben - Wenn sich beispielsweiße der Nutzer nicht abmeldet und den Computer ausschaltet und nach 2 Tagen wieder zurückkommt, dann soll er angemeldet bleiben - über session wird das ziemlich schwer, wenn nicht unmöglich - also muss ich das ganze in den Cookies abspeichern, aber der Nutzer soll auch die Möglichkeit bekommen, diese Cookies zu löschen - das geht zurzeit aber nicht.
Ist das irgendwo live, so dass man sich das mal anschauen könnte?
Srry, hab inzwischen ein paar codes probiert.. leider funzts nicht
also den code kannst dir nicht ansehen, weil der verdammt aufgesplittet ist und überall 100 includes etc. sind, ich hab hier aber ein wenig zusammengefasst:
(wenn du das ganze durchlest und dann auch beantworten kannst dann bekommst sternchen und gutes kompliment =) )
check.php (Script, das ausgeführt wird, wenn man sich anmeldet):
if($_POST['submit'] == true){
$username = strtolower($_POST['username']);
$pass = $_POST['password']."***";
$password = sha1($pass);
$sql = "SELECT `cookie_hash`,`username`,`rechte` FROM `main_users` WHERE LOWER(`username`) = '".mysql_real_escape_string($username)."' AND `password` = '".mysql_real_escape_string($password)."' AND `active` = 1";
$ergebnis = mysql_query($sql);
if(mysql_num_rows($ergebnis) == 1){
$usercookie = mysql_fetch_assoc($ergebnis);
$_SESSION['angemeldet'] = true;
$_SESSION['username'] = $usercookie['username'];
$_SESSION['rechte'] = $usercookie['rechte'];
setcookie('HorrorLogin', $usercookie['cookie_hash'], time()+3600, "/");
header("Location: ../index.php");
}else{
$_SESSION['errormessage'] = "Leider war der Login nicht erfolgreich! Bitte versuchen Sie es erneut.";
$_SESSION['error'] = true;
header('Location:../index.php');
}
}
phpheader.php (Mittels Get wird der Befehl zum Abmelden geschickt):
if ($_GET['logout'] == 'true'){
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$url = str_replace("?logout=true","",$url);
setcookie('HorrorLogin', '', time()-3600, "/");
session_unset();
$_SESSION = array();
session_destroy();
header("Location: ".$url."");
}
phpheader.php (Wenn Session aktiv, aber kein Cookie gesetzt, soll cookie gesetzt werden - Wenn Cookie gesetzt, aber keine Session aktiv, soll Session aktiviert werden):
if($_SESSION['angemeldet'] == true){
if(!isset($_COOKIE['HorrorLogin'])){
$sql = "SELECT `cookie_hash` FROM `main_users` WHERE LOWER(`username`) = '".mysql_real_escape_string($_SESSION['username'])."'";
$ergebnis = mysql_query($sql);
if(mysql_num_rows($ergebnis) == 1){
$usercookie = mysql_fetch_assoc($ergebnis);
setcookie('HorrorLogin', $usercookie['cookie_hash'], time()+3600, "/");
}
}
}else{
if(isset($_COOKIE['HorrorLogin']) && $_COOKIE['HorrorLogin'] != ""){
$sql = "SELECT `username`,`rechte` FROM `main_users` WHERE `cookie_hash` = '".mysql_real_escape_string($_COOKIE['HorrorLogin'])."' AND `aktiviert` = 1";
$ergebnis = mysql_query($sql);
if(mysql_num_rows($ergebnis) == 1){
$_SESSION['angemeldet'] = true;
$array = mysql_fetch_assoc($ergebnis);
$_SESSION['username'] = $array['username'];
$_SESSION['rechte'] = $array['rechte'];
}
}
}
Das wären eigentlich die wichtigsten Codes, zu diesem einem Cookie =)
Grundsätzlich solltest du die Tatsache ob ein Benutzer eingeloggt ist oder nicht nicht von der Existenz eines Cookies abhängig machen. Das kannst du z.B. so lösen:
Wenn der Benutzer automatisch eingeloggt werden soll, erstellst du ein Cookie mit einer eindeutigen ID (ähnlich der Session ID). Also z.B:
$UserName = 'Heinrich';
$UserID = 23;
// UID erzeugen
$loginCookieID = md5($UserName . date('YmdHns') . $UserID);
$expires = time()+60*60*24*30; // 30 Tage
setcookie('autolog', $loginCookieID, $expires, '/');
Dann schreibst du diese Daten in eine Datenbank um den Nutzer wiederzuerkennen. Könnte zum Beispiel so aussehen:
CREATE TABLE `tbl_auto_login` (
`UID` varchar(32) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`logged_in` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1=eingeloggt, 0=ausgeloggt',
`expires` int(11) unsigned NOT NULL,
PRIMARY KEY (`UID`),
UNIQUE KEY `UID` (`UID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=0;
Da haust du dann die Daten rein:
$sql = 'INSERT INTO
`tbl_auto_login`(
`UID`,
`user_id`,
`logged_in`,
`expires`)
VALUES(
"'. $loginCookieID .'",
'. (int) $UserID .'
1,
'. $expires .',
NULL)';
Wenn der Nutzer dann nach 2 Tagen auf die Seite kommt und du den Cookie autolog findest, überprüfst du die UID (also den Wert) des Cookies und siehst in der Tabelle nach, ob du diesen Wert dort in der Spalte UID findest. Wenn ja, siehst du über das Feld logged_in
ob der User automatisch eingeloggt werden soll oder nicht. Wenn der Nutzer nicht mehr automatisch eingeloggt werden soll, löscht du entweder den entsprechenden Eintrag aus der Datenbank, oder setzt logged_in
auf 0.
Gruß
Übrigens: Vielen Dank! Hat einwandfrei funktioniert - kann dir aber keinen Stern geben wegen dieser blöden 1ne antwort regel -.-
Du solltest die zeit auf mindestens 3600 Sekunden (eine Stunde) setzen. Evtl. sogar mehr, um Zeitverschiebungen zwischen Server und Client auszugleichen.
Danke, das hab ich natürlich, war nur zufaul das hier zutun, zumal das der übersicht nicht gut getan hätte ;-)
Trotzdem danke
Ups, srry hab das Beispiel schnell geschrieben, habe natürlich alles ordentlich geschrieben:
Das wäre der orignale Code, $name wird über eine foreach-schleife ausgefüllt (dient zur löschung aller cookies) (Dieser Code funktioniert aber nichteinmal wenn ich statt $name gleich den richtigen string hinschreibe, also daran liegts nicht