Logout funktioniert nicht richtig

Dennis Wronka

Soulcollector
Hi Leute, ich hab jetzt auch mal wieder ein Problem, und zwar ein interesseantes.
Erstmal das Script in dem ich den Fehler vermute, denn durch auskommentieren eines Blocks kann funktioniert das Logout wieder.
cleansessions.php
PHP:
<?
$session_prefix="sess_";
$sessions=mysql_query("select * from sessions",$db);
while ($session=mysql_fetch_row($sessions))
 {
//hier faengt der schlamassel an
  if (file_exists($session_path."/".$session_prefix.$session[0]))
   {
    if (filectime($session_path."/".$session_prefix.$session[0])+600<=time())
     {
      unlink($session_path."/".$session_prefix.$session[0]);
     }
   }
//und hier hoert's wieder auf
  if (!file_exists($session_path."/".$session_prefix.$session[0]))
   {
    mysql_query("delete from sessions where sessionid='$session[0]'",$db);
   }
 }
?>
Der Teil zwischen den Kommentaren verursacht irgendwie, dass ich mich nicht mehr ausloggen kann wenn ich einmal ausgeloggt bin.
Der Grund fuer diesen Schnipsel Code ist einfach. Da ich mit session_save_path() einen alternativen Pfad zum Speichern des Sessions festlege werden diese Sessions nicht durch die Garbage Collection von PHP geloescht.
Daher soll der problematische Abschnitt ueberpruefen ob die Session 10 Minuten nicht mehr geaendert wurde und dann loeschen.
Wenn dieser Part auskommentiert ist kann ich mich ein- und ausloggen wie ich lustig bin. Wenn der Part aber aktiv ist, dann ist Schluss mit lustig.
Dann kann ich mich einloggen, aber wenn ich auf Logout klicke bringt das nichts.
Da das auskommentieren dieses Abschnitts, wie schon gesagt, hilft bin ich sicher, dass das Problem dort liegt. Ich kann es mir aber nicht wirklich erklaeren warum.

Ach ja, ich hab das natuerlich auch mal lokal auf meiner Box getestet, und da funktioniert es einwandfrei.
Bei mir ist der Safe_Mode an, beim Hoster aus. Daher sollte es wohl nicht am Safe_Mode liegen.
 
Zuletzt bearbeitet:
Probier mal Folgendes:
PHP:
<?php

	$session_prefix = 'sess_';

	$query = "
		SELECT
		        `sessionid`
		  FROM
		        `sessions`
		";
	$result = mysql_query($query, $db);
	while( $row = mysql_fetch_array($result, MYSQL_NUM) ) {

		$tmp = $session_path.'/'.$session_prefix.$row[0];
		if( file_exists($tmp) ) {
			if( filectime($tmp) + 600 > time() ) {
				continue 2;
			}
			unlink($tmp);
		}
		$query = "
			DELETE
			  FROM
			        `sessions`
			  WHERE
			        `sessionid` = '".$row[0]."'
			";
		mysql_query($query, $db);

	}

?>
Ich hoffe, ich habe die Thematik richtig verstanden.
 
Da ich grad unter Windows bin (ja ich weiss, ich sollte mich schaemen) und nicht so direkt an meinen Code komme hab ich das Script mal fix runtergeladen und etwas modifiziert.
Jedoch hab ich nicht alle Deine Aenderungen uebernommen, sondern nur den Vergleich bei der Zeit. Da hast Du uebrigens den Check umgedreht, Du ueberpruefst meiner Meinung nach in die falsche Richtung, soll heissen, dass gecheckt wird ob time() groesser als die File-Change-Time+600 sec. ist.
Ich hab jetzt mal mein <= zu < geaendert und es scheint zu gehen.
Jetzt frag ich mich natuerlich immer noch: Warum? Und warum lief es mit <= auf meiner Box?
Kommt PHP4 vielleicht nicht mit <= klar?
Bei'm Provider hab ich glaub ich PHP4, auf meinem Rechner hab ich PHP5.
 
Meine Überlegung ging den umgekehrten Weg: Existiert die Datei zu einer Session-ID und wurde die vor weniger als 600 Sekunden erstellt, soll der nächste Datensatz aus der Abfrage gewählt werden. Sonst wird die Datei und der dazugehörige Datensatz gelöscht. Existert keine Datei zu einer Session-ID, wird der entsprechende Datensatz in der Datenbank gelöscht.
 
Gumbo hat gesagt.:
Meine Überlegung ging den umgekehrten Weg: Existiert die Datei zu einer Session-ID und wurde die vor weniger als 600 Sekunden erstellt, soll der nächste Datensatz aus der Abfrage gewählt werden.
Nee, nicht ganz.
Existiert die Datei und wurde seit 600 Sekunden nicht mehr geaendert gilt der User als disconnected und die Session-Datei wird geloescht.

Gumbo hat gesagt.:
Sonst wird die Datei und der dazugehörige Datensatz gelöscht. Existert keine Datei zu einer Session-ID, wird der entsprechende Datensatz in der Datenbank gelöscht.
Richtig, wenn die Session-Datei nicht mehr existiert soll auch der Datensatz aus der Datenbank geloescht werden.

Den ganzen Quatsch hab ich grundsaetzlich eingebaut um in der Datenbank festzuhalten ob der Browser Cookies unterstuetzt, damit das Login auch ohne Cookies funktioniert.
Es wird halt beim ersten Login gecheckt ob Dein Browser Cookies aktiviert hat und das Ergebnis in der Datenbank gespeichert.
Falls Du Cookies deaktiviert hast laueft die Session ueber Weitergabe der SessionID in der URL, ansonsten ueber Session-Cookies.

Auf jeden Fall mal vielen Dank fuer Deine Hilfe. Obwohl Du nicht ganz richtig gelegen hast mit der Deutung meines Scripts hast Du doch offensichtlich den richtigen Denkanstoss geliefert.
 
So, da ich annehme dass das Problem dadurch kam, dass mein Webspace-Anbieter PHP4 nutzt und ich daheim PHP5 teste ich mal eben was rum.
Meine Vermutung ist halt, dass
PHP:
$x<=$y;
unter PHP4 irgendwie nicht so recht will.

PHP5 spuckt Erwartungsgemaess sowohl Test1 als auch Test2 aus.
Jetzt kompilier ich grad PHP4 um es damit zu testen.
Ich erwarte nur Test2 zu sehen.
Sobald ich was neues weiss meld ich mich wieder. PHP kompiliert halt noch.

Okay, grad getestet.
Es macht bei mir lokal keinen Unterschied ob ich PHP4 oder PHP5 nutze.
Werde mal weitertesten und ggf. Erfahrungen berichten.
Hab mit den aktuellsten Version also 4.3.11 und 5.0.4 getestet.

Werd mal schauen was mir mein Webspace-Provider bietet. Ich weiss, dass ich auf PHP5 umschalten kann, das werd ich mal testen.

Das Testscript hab ich rausgeschmissen, da es auch beim Provider ohne Probleme lief.
Also, weitertesten ist angesagt.
Hab grad auf PHP5 umgestellt und muss jetzt bis zu 10 Min. warten bis es aktiv ist.

Bis zu 10 Minuten ist gut. Ich hab vor ueber einer Stunde umgestellt und kann immer noch nicht wieder zugreifen. :(

Da ich, nach nunmehr knapp 2 Stunden, immer noch nicht wieder drauf zugreifen kann markiere ich den Thread jetzt als erledigt und werde mich morgen, wenn moeglich, darum kuemmern und meine Auswertung hier praesentieren.
 
Zuletzt bearbeitet:
Zurück