PHP: Cookie löschen funktioniert nicht

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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 ]]]]]] )
Hosenmist95 
Fragesteller
 27.10.2012, 23:32

Ups, srry hab das Beispiel schnell geschrieben, habe natürlich alles ordentlich geschrieben:

setcookie($name, '', time()-360);

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

0
Sady82  27.10.2012, 23:49
@Hosenmist95

Warum möchtest du die Cookies denn überhaupt löschen? Benutzt du keine Sessions?

0
Hosenmist95 
Fragesteller
 27.10.2012, 23:55
@Sady82

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.

0
Sady82  28.10.2012, 00:03
@Hosenmist95

Ist das irgendwo live, so dass man sich das mal anschauen könnte?

0
Hosenmist95 
Fragesteller
 28.10.2012, 00:32
@Sady82

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 =)

0
Sady82  28.10.2012, 00:41
@Sady82

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ß

0
Hosenmist95 
Fragesteller
 28.10.2012, 00:47
@Sady82

Vielen Dank!

Das werde ich dann gleich so probieren.

gruß

0
Hosenmist95 
Fragesteller
 28.10.2012, 02:49
@Sady82

Übrigens: Vielen Dank! Hat einwandfrei funktioniert - kann dir aber keinen Stern geben wegen dieser blöden 1ne antwort regel -.-

0

Du solltest die zeit auf mindestens 3600 Sekunden (eine Stunde) setzen. Evtl. sogar mehr, um Zeitverschiebungen zwischen Server und Client auszugleichen.

Woher ich das weiß:Berufserfahrung – Entwickle seit > 20 Jahren Anwendungen mit PHP.
Hosenmist95 
Fragesteller
 29.10.2012, 17:59

Danke, das hab ich natürlich, war nur zufaul das hier zutun, zumal das der übersicht nicht gut getan hätte ;-)

Trotzdem danke

0