# session_id löschen wenn Browser geschlossen wird



## Psynosis (7. April 2008)

Hi Leute.

Ich habe nun mein login script soweit fertig! nun ist nur noch das letzte offen!

wie kann ich das anstellen das wenn ein eingeloggter User einfach den Browser schliesst
das die session_id aus meiner sql db gelöscht wird


----------



## Chaosengel_Gabriel (7. April 2008)

Schau dir mal das Skriptchen an:

```
<?php
session_start();
// Prüfen, ob ein Autologin des Users stattfinden muss
if(isset($_COOKIE['Autologin']) AND !isset($_SESSION['UserID'])){
$sql = "SELECT
ID
FROM
User
WHERE
Autologin = '".mysql_real_escape_string($_COOKIE['Autologin'])."'
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$row = mysql_fetch_assoc($result);
if(mysql_num_rows($result) == 1)
doLogin($row['ID'], '1');
}

// Online Status der User aktualisieren
if(isset($_SESSION['UserID'])){
$sql = "UPDATE
User
SET
Letzte_Aktion = '".time()."'
WHERE
ID = '".$_SESSION['UserID']."'
";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
}

// User ohne Autologin ausloggen
$sql = "UPDATE
User
SET
SessionID = NULL,
Autologin = NULL,
IP = NULL
WHERE
'".(time()-(60*30))."' > Letzte_Aktion AND
Autologin IS NULL
";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

// Kontrollieren, ob ein automatisch ausgeloggter User noch eine gültige Session besitzt
if(isset($_SESSION['UserID'])){
$sql = "SELECT
SessionID
FROM
User
WHERE
ID = '".$_SESSION['UserID']."'
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$row = mysql_fetch_assoc($result);
if(!$row['SessionID']){
$_SESSION = array();
session_destroy();
}
}
?>
```


----------



## Psynosis (7. April 2008)

Habe es mir angeschaut. und auch mal etws ausprobiert aber es klappt leider nicht bei mir! kannst du mir das bitte etwas genauer erleutern?


----------



## Chaosengel_Gabriel (7. April 2008)

Also die Kommentare klären ja schonmal was wann wo gemacht wird...
Der Skript gehört an den anfang jeder Seite...
Am besten einfach includen...

Dann musst du nur noch sicherstellen, dass die Bezeichner... Also die Variablen mit denen, die du im Skript verwendest übereinstimmen...

Also die Bezeichnungen der $_SESSION, sowie die Spalten in der Tabelle müssen stimmen...

Das Skript handelt das auto-login, auto-logout und auch das Session-TimeOut...


----------



## Psynosis (7. April 2008)

könntest du mir eventuell noch die db daten bekantgeben? was ich alles brauche?

ich habe zB.


```
CREATE TABLE IF NOT EXISTS `users` (
  `UserID` int(11) NOT NULL auto_increment,
  `UserSession` varchar(32) default NULL,
  `fname` varchar(255) NOT NULL default '',
  `lname` varchar(255) NOT NULL default '',
  `email` varchar(255) NOT NULL default '',
  `pwd` varchar(32) NOT NULL default '',
  `addr` varchar(255) NOT NULL default '',
  `city` varchar(255) NOT NULL default '',
  `country` varchar(255) NOT NULL default '',
  `zipcode` varchar(255) NOT NULL default '',
  `phone` varchar(255) NOT NULL default '',
  `visits` int(8) NOT NULL,
  `datesignup` datetime NOT NULL,
  `lastchange` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`UserID`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
```


----------



## Gumbo (7. April 2008)

Was mir auf die Schnelle aufgefallen ist: Wo werden $_COOKIE['Autologin'] und $_SESSION['UserID'] gesetzt?


----------



## Psynosis (7. April 2008)

meinst du bei mir?


----------



## Chaosengel_Gabriel (7. April 2008)

```
<?php
session_start();

// Online Status der User aktualisieren
if(isset($_SESSION['UserID'])){
$sql = "UPDATE
users
SET
Letzte_Aktion = '".time()."'
WHERE
UserID = '".$_SESSION['UserID']."'
";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
}

// User ohne Autologin ausloggen
$sql = "UPDATE
users
SET
UserSession = NULL,
IP = NULL
WHERE
'".(time()-(60*30))."' > Letzte_Aktion  //Hier wird festgelegt wie lange ein User ohne Aktion als online gilt, bevor die session zerstört wird!
";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

// Kontrollieren, ob ein automatisch ausgeloggter User noch eine gültige Session besitzt
if(isset($_SESSION['UserID'])){
$sql = "SELECT
UserSession
FROM
users
WHERE
UserID = '".$_SESSION['UserID']."'
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$row = mysql_fetch_assoc($result);
if(!$row['SessionID']){
$_SESSION = array();
session_destroy();
}
}
?>
```

So sind die Spalten weitestgehend umgeschrieben und den Teil mit dem auto-login, hab ich raus genommen... Wäre ne entsprechende CheckBox im Login-Feld... Kennste ja heir ausm Forum sicher...

In der DB fehlt dann noch:

```
IP VARCHAR(15) NOT NULL
Letzte_Aktion INT NOT NULL DEFAULT 0
```

Dann müsste es eigentlich so klappen...

Hatte den Skript so von mir übernommen Gumbo...
Wird bei mir alles in der doLogin() gehandelt 

Benutze das so seit ner Weile, es funktioniert also mit sicherheit ^^

[EDIT]

Ich glaube...
Letzte_Aktion == lastchange

Und setz nickname auch UNIQUE!


----------



## Psynosis (7. April 2008)

nun wenn ich einlogen will kommt immer ein fehler das ich nicht berechtigt bin! wie
sich die session_id gleich nach dem login ändern würde!


----------



## Chaosengel_Gabriel (7. April 2008)

Danke fürs zusammen rücken des Posts... ^^

Könntest du bitte mal die Fehlermeldung posten...

Evtl beißt sich mein Snippet da mit deinen Skripts...

Ich versteh nich ganz was wo wie der Fehler sein soll...


----------



## Psynosis (7. April 2008)

ich schick dir im anhang gleich mein mehr oder weniger kompletten login

PS: er läst mich einfach nicht mehr einloggen es giebt keinen richtigen fehler aus!
und ich habe auch langsam die übersicht verlohren!!


----------



## Chaosengel_Gabriel (7. April 2008)

Oki...
Ich schau mal nach, kann nen Momentchen dauern...

*in dem stillen Coding-Keller verkriech* ^^

[EDIT]

Mir fällt auf, dass es sich um nen fertig Skript handelt...
Die logische Aufteilung der Funktionen und so auf den Seiten is mir dabei nen bissl schleierhaft, da ich, seid ich mit PHP arbeite, das handling über eine index.php bevorzuge, wodurch ich wesentlich weniger Probleme mit session_start() und db_connect() habe...

Mach dir mal die Mühe und arbeite dieses Tut durch, bzw lese es und kopier dir das nötigste, um das was du dir da fertig besorgt hast, etwas übersichtlicher und praktischer Strukturiert selber anzufangen: http://www.tutorials.de/forum/php-tutorials/289098-login-mit-php-und-mysql.html#post1492136

Ich denke, dann wirst du auch weniger Probleme damit haben


----------



## Chaosengel_Gabriel (7. April 2008)

Noch Abschließend ergänzend...

Wenn du selber ncih wirklich vor hast groß php zu lernen, dann geb mir bescheid, wir sprechen das genauer ab, was du vorhast und ich bastel dir was fürn kleines Taschengeld fertig


----------



## Psynosis (8. April 2008)

aller besten dank für deine Hilfe! ist echt voll super!
mal ne frage. du kommst nicht per Zufall aus der Schweiz?...
denn ich würde sehr gerne mehr php lernen aber für Abend Kurse habe ich zuwenig zeit!
ich könnte aber gut online Kurse machen! aber das Problem ist das wenn du nicht in der Schweiz wohnst kann ich sehr schlecht einzahlen!! da ich kein € Konto habe!!

ich weiss das dieses script von mir  ist! aber köntest du mir evt. trozdem sagen wie ich es zum laufenbringe?
ich hocke nun schon über 1 Monat daran 

PS: dieses Tut das du mir vorgeschlagenhast! schau mal meine check_user.php an


----------



## campari (8. April 2008)

Der Threadstarter wollte doch wissen, wie die Session für ungültig gesetzt wird, wenn der Browser geschlossen wird. Das ist mit PHP nicht möglich.
Es bräuchte dafür eine clientseitige Sprache. Wie und ob das z.B. mit Javascript möglich wäre, no idea. Aber ich wollt nur darauf hinweisen, dass die gezeigten Beispiele keine Session auf dem Server löschen, sobald der Benutzer den Browser schliesst


----------



## Psynosis (8. April 2008)

kann mir jemand sagen wie hier die zeit gehändelt werden muss?
60*30 wie lange soll das sein?




```
// User ohne Autologin ausloggen 
$sql = "UPDATE 
users 
SET 
UserSession = NULL, 
IP = NULL 
WHERE 
'".(time()-(60*30))."' > Letzte_Aktion  //Hier wird festgelegt wie lange ein User ohne Aktion als online gilt, bevor die session zerstört wird! 
"; 
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
```


----------



## kuddeldaddeldu (8. April 2008)

Hi,

das sind Sekunden. Also wird dort eine halbe Stunde abgezogen.

LG


----------



## Chaosengel_Gabriel (9. April 2008)

Falsch, falsch, falsch...
PHP Rechnet in Millisekunden oder so...
Die Zeit angabe müssten nur wenige Minuten sein... Jedenfalls weniger als ne halbe Stunde...

@ Psy: Bin leider nicht aus der Schweiz... Spiele mit dem Gedanken entsprechende Kurse zu geben, aber die einfache Hilfe gibts auch hier umsonst 

@Davor...
Dise Prozedur IST mit PHP möglich...
Sonst könnte ich es ja wohl schlecht auf meiner Web-Site so machen, oder!?
Der Grundgedanke ist ganz simpel... Ich prüfe bei JEDEN Aufruf der Seite... Also egal wer wann wie wo was aufruft von der Site... SÄMTLICHE Einträge in der DB... Und so kann ich die Sessions zerstören von Usern, die zulange nimma da sind


----------



## kuddeldaddeldu (9. April 2008)

Hi,



> Falsch, falsch, falsch...
> PHP Rechnet in Millisekunden oder so...



Blödsinn. time() liefert die Anzahl *Sekunden* seit dem 1.1.1970 0:00 Uhr zurück. Wenn Du davon 60*30 abziehst, ziehst Du eine halbe Stunde ab. 



> @Davor...
> Dise Prozedur IST mit PHP möglich...



Ist sie nicht. Denn:



> Und so kann ich die Sessions zerstören von Usern, die zulange nimma da sind



Was aber nunmal nicht dasselbe ist, wie "wenn der User den Browser schließt". Das kriegt der Server nämlich gar nicht mit. Der weiß zudem nicht einmal, dass Du überhaupt einen Browser hast.

Sei mir nicht böse: Es ist ja keine Schande, nach einem Jahr noch nicht alles zu wissen, aber vielleicht sollte man den Mund dann auch nicht immer ganz so voll nehmen...

LG


----------



## Chaosengel_Gabriel (9. April 2008)

> Zitat:
> Falsch, falsch, falsch...
> PHP Rechnet in Millisekunden oder so...
> Blödsinn. time() liefert die Anzahl Sekunden seit dem 1.1.1970 0:00 Uhr zurück. Wenn Du davon 60*30 abziehst, ziehst Du eine halbe Stunde ab.


Der Skript verursacht bei mir nen Session-TimeOut in weniger als 30 Minuten...
Deiner Argumentation nach zu urteilen, hast du Recht, aber irgendwie passt da zeitlich dann irgendwas nich =)



> Zitat:
> @Davor...
> Dise Prozedur IST mit PHP möglich...
> Ist sie nicht. Denn:
> ...



Richtig, der Server kennt keinen Browser...
Aber der Server kennt die in der DB gespeicherten Zugriffsdaten, des Users... Also IP, SessionID und Zeitpunkt der letzten Aktion...
Durch den von mir geposteten Skript erzielt, das die Session eines Users zerstört wird, wenn dieser eine gewisse Zeit nicht mehr aktiv durch die Site surft...
Diese Inaktivität kann darauf zurückgeführt werden, dass der User den Browser geschlossen hat ohne sich ordentlich auszuloggen...
Und deswegen sehe ich meine Aussage, dass dies ein endsprechendes Handling ist, als gerechtfertigt...
Man mag es wohl eher als Work-Around bezeichnen oder so...
Aber das Prinzip is wohl klar und der Zweck is so ziemlich der Gleiche...

Es geht schließlich darum, einen User NACHTRÄGLICH auszuloggen...
Ob nun, wenn dieser den Browser schließt oder wenn er nur lange genug inaktiv ist, is doch relativ wurst ^^



> Sei mir nicht böse: Es ist ja keine Schande, nach einem Jahr noch nicht alles zu wissen, aber vielleicht sollte man den Mund dann auch nicht immer ganz so voll nehmen...



Nehm ich dir nich krumm... Haste wohl auch recht mit...
Zu meiner Verteidigung:
Ich versuche mein "Nicht-Wissen" mit der Logik auszugleichen, die sich aus meinem Wissen ergibt...
Was die Zeit in PHP betrifft hab ich ja oben bereits erläutert 

PS: Wenn sich keiner aus dem Fenster lehnt und den Mund etwas zu voll nehmen würde, würde es doch kaum ordentliche Diskussionen geben, oder!? ^^


----------



## Psynosis (10. April 2008)

Habe nochmals ein problemchen.......

bei mir leuft es nicht!
kann es sein das ich noch die IP irgendwie in meine db kriegen muss?
wenn ja wie geht das am besten


----------



## Chaosengel_Gabriel (10. April 2008)

*rofl*
DAS is bei den Diskussionen keinem aufgefallen, dass das fehlt ^^

*im login Skript such*falsche File*in der login-function such*


```
IP = '".$_SERVER['REMOTE_ADDR']."'
```

Mit $_SERVER['REMOTE_ADDR'] liest du die IP des Client


----------



## Psynosis (10. April 2008)

Irgendwie so? 

```
$sql="insert into users IP
			values = '".$_SERVER['REMOTE_ADDR']"'
			$result = mysql_query($sql)";
```

Dann kommt ein fehler
*
Parse error: syntax error, unexpected '"' in*


----------



## Chaosengel_Gabriel (10. April 2008)

Na da hast du den Statement-Syntax ein bissl verhauen ^^

```
$sql="insert into
 users
 IP = '".$_SERVER['REMOTE_ADDR']"'
";
$result = mysql_query($sql);
```


----------



## Loomis (10. April 2008)

Chaosengel_Gabriel hat gesagt.:


> Na da hast du den Statement-Syntax nen bissl verhauen ^^
> 
> ```
> $sql="insert into
> ...


Du aber auch 


```
$sql = 'INSERT INTO users(IP) VALUES(`' .$_SERVER['REMOTE_ADDR']. '`)';
            $result = mysql_query($sql);
```

MySql-Insert


----------



## Psynosis (10. April 2008)

hattest noch einen "." vergessen! 


```
$sql="insert into
 users
 IP = '".$_SERVER['REMOTE_ADDR']."'";
$result = mysql_query($sql);
```

aber er schreibt mir die IP immer noch nicht in die db!


----------



## Chaosengel_Gabriel (10. April 2008)

@Loomes:
Ich meinte in einem anderen Thread gelesen zu haben, dass das auch ginge...
Will da aber einen Irrtum nicht ausschließen!

@ Psy:
Siehe Loomes Post


----------



## Psynosis (10. April 2008)

habe ich auch schon probiert!

nichts einfach nichts in der db


----------



## Loomis (10. April 2008)

Fehlermeldung?


----------



## Psynosis (10. April 2008)

Es gibt keine!

PS: vieleicht sollte ich noch erwähnen "da es mir gerade auffählt"

Ich muss die IP beim User der gerade online ist eintragen!

ca. so 
	
	
	



```
function login($userid)
{
    $sql="UPDATE users
    SET UserSession='".session_id()."'
    WHERE UserID='$userid'"; 
	mysql_query($sql);
}
```


----------



## Chaosengel_Gabriel (10. April 2008)

Bring das Eintragen im Login unter...
Also da, wo die anderen nötigen Daten für die Session beim einloggen auch rein geschrieben werden...

Man kann die IP auch für andere Zwecke loggen, aber das is hier ja zur Zeit nicht nötig..


----------



## kuddeldaddeldu (10. April 2008)

Jungs, mal ehrlich: wollt Ihr den armen Kerl veräppeln?

Schaut die korrekte Syntax doch wenigstens mal nach, wenn Ihr das nicht so im Kopf habt. Der probiert sich ja den Wolf mit Euren falschen Statements.

- *Werte* werden nicht in Backticks gesetzt, nur *Bezeichner*.
- INSERT INTO ... *SET* Spalte = "..."

So sollte es gehen:


```
$sql="insert into
 users
 SET IP = '".$_SERVER['REMOTE_ADDR']."'";
$result = mysql_query($sql);
```

Und wenn Abfragen nicht funktionieren, solltest Du das testhalber so machen:


```
$result = mysql_query($sql) or die(mysql_error() . '<br/>' . $sql);
```

Dann gibt's auch eine Fehlermeldung.

LG


----------



## Psynosis (10. April 2008)

PS: vieleicht sollte ich noch erwähnen "da es mir gerade auffählt"

Ich muss die IP beim User der gerade online ist eintragen!

ca. so

```
function login($userid)
{
    $sql="UPDATE users
    SET UserSession='".session_id()."'
    WHERE UserID='$userid'"; 
    mysql_query($sql);
}
```

aber wenigstens hatt er mir die ip in die db geschrieben! aber auf eine neue eigene 
linie.


----------



## kuddeldaddeldu (10. April 2008)

Hi,

ein einfaches Update-Statement sieht so aus:


```
UPDATE Tabelle SET Spalte1 = 'Wert1', Spalte2 = 'Wert2', ... WHERE Bedingung
```

Den Rest kannst Du jetzt aber wirklich alleine.

LG


----------



## Psynosis (10. April 2008)

ich habe es mal so versucht aber es geht nicht!


```
function iplog($userid)
{
    $sql="UPDATE users
    SET IP = '".$_SERVER['REMOTE_ADDR']."'
    WHERE UserID='$userid'";
	mysql_query($sql);	
}
```

deshalb habe ich auch nachgefragt. sollte doch klappen? so wie ich das gemacht habe?


----------



## Flex (10. April 2008)

Was sagt [phpf]mysql_error[/phpf] wenn du es genau in dieser Funktion einsetzt?


----------



## Psynosis (10. April 2008)

es wird mir nur "0:" angezeigt


----------



## Flex (10. April 2008)

Wo rufst du die Funktion denn auf?

Könntest du vielleicht mal das ganze Skript posten, damit man sich einen Überblick verschaffen kann? Immer nur mit Schnipseln zu arbeiten ist ein wenig lästig.


----------



## Psynosis (10. April 2008)

OK. 

Das ist die check_user.php


```
<?
function connect()
{
    $con= mysql_connect('----','-----','-----') or die(mysql_error());
     mysql_select_db('outsk_login',$con) or die(mysql_error());
}
connect();
function check_user($email, $pwd)
{
    $sql="SELECT UserID
    FROM users
    WHERE email='".$email."' AND pwd=MD5('".$pwd."')
    LIMIT 1";
	connect();
    $result= mysql_query($sql) or die(mysql_error());
    if ( mysql_num_rows($result)==1)
    {
        $user=mysql_fetch_assoc($result);
        return $user['UserID'];
    }
    else
        return false;
}

function login($userid)
{
    $sql="UPDATE users
    SET UserSession='".session_id()."'
    WHERE UserID='$userid'"; 
	mysql_query($sql);
}

function logged_in()
{
    $sql="SELECT UserID
    FROM users
    WHERE 
	UserSession='".session_id()."',
    LIMIT 1";
    $result= mysql_query($sql);
    return ( mysql_num_rows($result)==1);
}

function logout()
{
    $sql="UPDATE users
    SET UserSession=NULL
    WHERE UserSession='".session_id()."'";
    mysql_query($sql);
}
function iplog($userid)
{
    $sql="UPDATE users
    SET IP = '".$_SERVER['REMOTE_ADDR']."'
    WHERE UserID='$userid'";
	  $result = mysql_query($sql);	
}
?>
```

und das ist die login.php


```
<?php
session_start();
include('a.php');
include('check_user.php');
$userid = "UserID";
login($userid);
iplog($userid);
include('config.php');	
//Beim Absenden des Formulars
if(isset($_POST['submit']))
{
	$userid=check_user($_POST['email'], $_POST['pwd']);
    if ($userid!=false)
        login($userid);
	//Variablen werden aus dem Formular geholt
	$email = $_POST['email'];
	$pwd = $_POST['pwd'];
	
	//Wenn E-Mail/Passwort nicht deklariert wurden, gehe zur Login-Seite
	if ($email=="" || $pwd=="")
	{
		echo "<Script>alert('Bitte geben Sie Ihre Benutzerdaten ein!')</script>";
		echo "<Script>history.back()</script>";
		exit();
	}
	
	//Ansonsten vergleiche sie mit der Datenbank
	else
	{
		$pwd = md5($pwd);
		
		db_connect();
		$result = mysql_query("SELECT * FROM users WHERE (email='$email' ||
    UserID='$userid') && pwd='$pwd'");
		
		//Bei richten Daten, gehe zum Useraccount
		if(mysql_num_rows($result)===1)
		{
			//Visits erhöhen
			$sql="UPDATE users 
			SET visits='".($email['visits']+1)."' 
			WHERE (email='$email' || UserID='$userid') && pwd='$pwd'";
			mysql_query($sql) or die("update fails");
		
			$users = mysql_fetch_array($result);
			
			db_disconnect();
			$_SESSION['UserID'] = $users['UserID'];
			$_SESSION['email'] = $users['email'];
			$_SESSION['pwd'] = $users['pwd'];
			$_SESSION['allow_login'] ="yes";
			header("Location: ".BASEHREF."/cms.php");
			exit();
		}
		//Ansonten, zeige Fehlermeldung	
		else
		{
			db_disconnect();
			echo "<Script>alert('Ihr Benutzername oder Passwort ist falsch!')
      </script>";
			echo "<Script>history.back()</script>";
			exit();
		}
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "
http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?php echo TITLE; ?></title>
</head>
<body>
<link href="<?php echo STYLESHEET_HREF; ?>" rel="stylesheet" type="text/css" />
<div class="promem_body">
<div class="promem_header">Login</div>
  <form action="#" method="post">
    <table class="promem_content">
      <tr>
        <td width="50%"><div class="promem_text">E-Mail-Adresse:</div></td>
        <td width="50%"><input type="text" name="email" /></td>
      </tr>
      <tr>
        <td width="50%"><div class="promem_text">Passwort:</div></td>
        <td width="50%"><input type="password" name="pwd" /></td>
      </tr>
      <tr>
        <td colspan="2"><div class="promem_text"><a href="<?php //echo BASEHREF;
         ?>/forgot.php"></a></div></td>
      </tr>
      <tr>
        <td colspan="2"><div class="promem_text"><a href="<?php //echo BASEHREF;
         ?>/signup.php"></a></div></td>
      </tr>
    </table>
    <div class="promem_button">
      <input type="submit" value="  Login  " name="submit" />
    </div>
  </form>
  <noscript><br />Sie m&uuml;ssen Javascript aktivieren, um fortfahren zu
  k&ouml;nnen!</noscript>
</div>
</body>
</html>
```


oder soll ich alles zippen und hochladen?


----------



## Chaosengel_Gabriel (10. April 2008)

Ich benutz dabei garkeine Ticks^^
Reicht schon, dass ich ticke xD

Rischtisch Psy...
In dem Statement solltest dud ie IP mit eintragen lassen...
Also:

```
function login($userid)
{
    $sql="UPDATE users
    SET UserSession='".session_id()."',
    IP = '".$_SERVER['REMOTE_ADDR']."'
    WHERE UserID='$userid'"; 
    mysql_query($sql);
}
```

Dann hatte ich diese Variante des Statements bei dir gelesen knuddel, aber falsch wieder gegeben... *schäm*
ABER...

```
INSERT INTO
users
(IP
)
VALUES
('".$_SERVER['REMOTE_ADDR']."'
)
```

klappt aber auch^^
Sonst würde mich wundern, weshalb das in meinen Skripten klappt 

[EDIT]

Post verspätet eingetragen, da ci hbeim schreiben 20min weg war...
Wegen Notfall afk gewesen


----------



## Psynosis (10. April 2008)

ahhh 

da geht!!

Ist ja super!! jetzt muss ich nur noch schauen ob es mich auch automatisch rauswierft!
Nach ca. einer halben stunde.

PS: wie kann ich hier noch die zeit ändern? das schnall ich irgendwie nicht so ganz?!
wie sieht es zB. aus wenn ich will das es mich nach schon 5min rauswierf


```
$sql = "UPDATE users
SET UserSession = NULL,
IP = NULL
WHERE
'".(time()-(60*30))."' > lastchange";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
```


----------



## Chaosengel_Gabriel (10. April 2008)

'".(time()-(60*30))."' <-Der Teil entscheidet über die Dauer...

Aber in welchem Maß da gerechnet wird ist mir auch nicht ganz schlüssig...
Sollen rechnerisch ja 30min sein... Aber verursacht den TimeOut bei mir nach ca 3min schon...
Ich schau mir das nochmal in meinen Skripten näher an... Sicherlich wird sich bisdahin jemand finden, der uns weiter helfen kann xD


----------



## Psynosis (10. April 2008)

hmm..
dann solte er mich ja schon lange kicken!!

bin aber laut db immernoch online


----------



## MiNiMaG (10. April 2008)

Das Ganze über die Zeit zu lösen ist ebenfalls nicht die Lösung:
User geht mal schnell shoppen und Essen. Nach 4 Stunden kommt er wieder und hatte die ganze Zeit den Browser offen.

Die Lösung ist doch ganz Simpel:
- User kriegt Session
- SessionID wird in DB geschrieben und User erhält eine Fake-SessionID
- Fake SessionID wird dem User an jeden Link und Formular (also GET / POST) angehängt
- Solange User die Fake-SessionID mit sich rumführt behält er seine Session...


----------



## Chaosengel_Gabriel (10. April 2008)

Die Funktion zum kicken muss jeder User beim besuchen/surfen auf der Site automatisch auslösen...
Daher soll der Teil am Anfang jeder Seite stehen...

Das Prozedere isn etwas umständlich gemachter CronJob...
Denn CronJobs kann man ja nicht immer überall auf jedem Server verwenden ^^

[EDIT]

Die Prozedur, die ich verwende ist eine Session-TimeOut Funktion!

@Minimag
Wenn der User länger als die angegebene Zeit nicht aktualisiert und somit die letzte Aktion nicht aktualisiert wird, dann wird der entsprechende User beim nächsten Aufruf der Seite(wer auch immer sie aufrufen mag) herrausgefunden und die Session Daten aus der Db entfernt, sowie die Session zerlegt...


----------



## kuddeldaddeldu (10. April 2008)

Hi,



> PS: wie kann ich hier noch die zeit ändern? das schnall ich irgendwie nicht so ganz?!
> wie sieht es zB. aus wenn ich will das es mich nach schon 5min rauswierf



Auch wenn Gabriel das nicht glauben mag:


```
time() - 60*30
```

zieht eine halbe Stunde vom aktuellen Timestamp ab. Wenn Du nur 5 Minuten haben willst, wäre 60*5 ein heißer Anwärter.

Wo _setzt_ Du eigentlich lastchange? Und was ist das für ein Datentyp?

LG


----------



## Psynosis (10. April 2008)

habe dein script ja per include auf jeder seite!


```
<?php
$con= mysql_connect('----','----','----') or die(mysql_error());
     mysql_select_db('outsk_login',$con) or die(mysql_error());

// Online Status der User aktualisieren
if(isset($_SESSION['UserID']))
{
$sql = "UPDATE users
SET lastchange = '".time()."'
WHERE UserID = '".$_SESSION['UserID']."'";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
}

// User ohne Autologin ausloggen
$sql = "UPDATE users
SET UserSession = NULL,
IP = NULL
WHERE
'".(time()-(60*30))."' > lastchange";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

// Kontrollieren, ob ein automatisch ausgeloggter User noch eine 
gültige Session besitzt
if(isset($_SESSION['UserID'])){
$sql = "SELECT UserSession
FROM users 
WHERE UserID = '".$_SESSION['UserID']."'";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$row = mysql_fetch_assoc($result);
if(!$row['UserSession']){
$_SESSION = array();
session_destroy();
}
}
?>
```


```
`lastchange` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
```


----------



## Chaosengel_Gabriel (10. April 2008)

@knuddel
Ich glaub dir das wohl...
Kann es sein, dass der Unterschied zwischen dem geprüften Wert und dem tatsächlichen TimeOut-Interval, durch ne Server einstellung aufkommt?
Ist es also möglich, dass der Server bereits ein automatisches Session-TimeOut benutzt?


----------



## kuddeldaddeldu (10. April 2008)

Chaosengel_Gabriel hat gesagt.:


> @knuddel
> Ich glaub dir das wohl...
> Kann es sein, dass der Unterschied zwischen dem geprüften Wert und dem tatsächlichen TimeOut-Interval, durch ne Server einstellung aufkommt?
> Ist es also möglich, dass der Server bereits ein automatisches Session-TimeOut benutzt?



@Gaby
Dann solltest Du Deine Servereinstellung vielleicht einfach mal überprüfen und/oder in der Datenbank mal nachschauen, ob die Daten da immer so drinstehen, wie Du das erwartest.
BTW: Was soll überhaupt dieses Gemisch aus PHP-Sessionhandling und eigener Datenbank?

LG


----------



## Chaosengel_Gabriel (10. April 2008)

Das hauptsächliche Session-Handling macht der Server per Cookie automatisch...
Zumindest bei mir... Bin ja noch bei funpic ^^

Die Einträge in der DB dienen nur der Überprüfung im Skript...
Vllt kann ich die auch irgendwann nochmal für was anderes gebrauchen xD

Ich überlege noch, wie ich, wenn der Client keine Cookies akzeptiert, das Session-Handling statt per Cookie auf die Übergabe der SID in der URL ändere...
Aber da fehlt mir jede Idee und jeglicher Ansatz ^^

Die Daten in der DB prüfe ich in solchen Fällen eh meistens, da läuft alles glatt... Ich nehm mal die php.ini unter die Lupe...

[EDIT]

phpinfo() sagt folgendes:
Session Support 	enabled
session.cache_expire	180
session.cookie_lifetime	3600
session.gc_maxlifetime	1200

Das müssten die Daten sein, die besagen, dass der Server die Sessions automatisch handelt...
Sowie die Auto-TimeOut Zeiten...

Oder irre ich?


----------



## kuddeldaddeldu (10. April 2008)

Hi,



> Die Einträge in der DB dienen nur der Überprüfung im Skript...



Gerade das ist ja überflüssig. Prüfe die Daten des $_SESSION-Arrays...



> Vllt kann ich die auch irgendwann nochmal für was anderes gebrauchen xD



Gegen das Speichern für z.B. statistische Zwecke spricht ja auch nichts...



> Ich überlege noch, wie ich, wenn der Client keine Cookies akzeptiert, das Session-Handling statt per Cookie auf die Übergabe der SID in der URL ändere...
> Aber da fehlt mir jede Idee und jeglicher Ansatz



Du solltest mal anfangen, das Manual ergänzend zu den ganzen ratz-fatz-läuft-das-Tutorials zu lesen...

LG


----------



## Chaosengel_Gabriel (10. April 2008)

kuddeldaddeldu hat gesagt.:


> Hi,
> 
> 
> 
> ...



Hat 2 Hacken...
1. Habe ich keinen root-Zugriff aufm Server...
2. Hab ich nicht sonderlich viel nerv darauf sämtliche Links auf meiner Site zuändern...
Da is nen Hinweis, dass die Cookie-Akzeptanz aktiviert sein sollte, schon eher in Betracht zu ziehen^^

Ich lese außerdem schon mehr als ich code...


----------



## kuddeldaddeldu (10. April 2008)

Hi,



> 1. Habe ich keinen root-Zugriff aufm Server...



 Worauf bezieht sich das jetzt?



> 2. Hab ich nicht sonderlich viel nerv darauf sämtliche Links auf meiner Site zuändern...



Unter gewissen Bedingungen musst Du das ja auch nicht, wie Dir das Manual verraten sollte...

LG


----------



## Chaosengel_Gabriel (10. April 2008)

> 1. Habe ich keinen root-Zugriff aufm Server...


Bezog sich aufs Manual, da die meisten dort aufgeführten Informationen sich auf die php.ini beziehen...


----------



## kuddeldaddeldu (10. April 2008)

Hi,

dann beschäftige Dich doch mal länger als nur schlappe 10-15 Minuten damit. In der Tabelle steht in der Spalte "Änderbar" überall "PHP_INI_ALL". Finde heraus, was das bedeutet.
Langsam hab' ich echt keinen Bock mehr...

LG


----------



## Psynosis (10. April 2008)

Hey leute!
das ist ein forum!! nicht ein schlachtfeld!
wenn es jemandem nicht mehr passt soll er oder sie einfach nicht mehr schreiben! es geht hier um hilfeleistung. also......

immer nett sein!

Dein gegenüber kann auch nichts dafür das du schlauer bist "oder meinst zu sein"


----------



## kuddeldaddeldu (10. April 2008)

Hi, 

wo tobt hier eine Schlacht? Ich versuche, ihm nahezubringen, dass dieses Datenbank/Session-Gemisch nicht günstig ist. Das PHP-Sessionhandling bietet alles, was man dazu braucht. Und er geht drauf ein, also scheint es ihn ja wenigstens zu interessieren. Immerhin sucht er ja auch immer noch den Grund für das seltsame Timeout-Verhalten seines Scripts. Wenn ich dann irgendwann mal genervt bin, wenn ich jede Einzelheit vorkauen muss, die man auch nachlesen kann, dann sage ich das auch (in angemessener Form).

Und wo genau ist jetzt _Dein_ Problem damit? Hast Du jetzt mal den Timeout bei Dir gemessen, während wir uns hier die Zeit vertrieben haben?

LG


----------



## Psynosis (10. April 2008)

Dann kanst du mir sicher sagen wie ich das machen kann, das wen der user sein fenstr schliest ohne abmelden das er automatisch offline geht


----------



## kuddeldaddeldu (11. April 2008)

Hi,

kann ich: das kannst Du gar nicht. Das einzige, was Du machen könntest, ist, die Lebenszeit des Sessioncookies auf 0 zu setzen. Dann würde zumindest der Cookie gelöscht. Wenn denn der Benutzer überhaupt Cookies akzeptiert. Der Server bekommt davon aber nichts mit und die Session ist dort noch vorhanden.
Man macht das deshalb auch schon so, dass man eine Verfallszeit definiert und abgelaufene Sessions löscht. Man muss dabei allerdings auch beachten, dass ein solcher Mechanismus schon im PHP-Sessionhandling integriert ist. Sessiondaten haben auf dem Server eine Lebensdauer, die nicht mit dem übereinstimmen muss, was Ihr Euch so ausgedacht habt.

LG


----------



## Psynosis (12. April 2008)

und wie geht den das?


----------



## Chaosengel_Gabriel (12. April 2008)

Lass dich doch nich so von mir stressen knuddel ^^
Recht hat er aber auch Psy xD Ich bin halt ansträngend 

Das Prozedere, dass ich da ja noch benutze hab ich aus einem der ersten Tuts, die ich in meiner Anfangszeit gelesen hab und mir bislang keine weiteren Gedanken darüber gemacht, weils ja funktioniert ^^

Wie ich schon sagte, knuddel, ich bin fleißig am lesen, aber hab halt nicht die Zeit NUR zu lesen und nach ner Weile krieg ich Kopfweh, wenn ich die ganze Zeit nur englisch lese ^^ Ich versteh es zwar, aber manche Vokabeln entziehen sich dann doch meinem Definitionsvermögen ^^ Zumal es auf englisch etwas schwieriger zu verstehen ist, als wenn es auf deutsch wäre...

Aber zur Entschädigung für dich, kuddeldaddeldu... *ganz dolle umknuddel*


----------



## Psynosis (14. April 2008)

Hallo zusammen,


kann es auch sein das es bei mir nicht klappt weill 
auf dem Server die 
session.cookie_lifetime auf 0 steht

PS: ist nicht änderbar!


----------



## Chaosengel_Gabriel (14. April 2008)

Also wenn ich jetzt keinen absoluten Schwachsinn erzähle, daan is durch diese Angabe das Cookie Managen der Session vom Server her deaktiviert, es werden also keine automatsichen Session Cookies angelegt...

Und das hat zur folge, dass du das wohl selbst machen musst...


```
setcookie("NameDesCookie", $Inhalt, time()+60*60*24*365*10); //letzteres ist die Lebensdauer des Cookies... hier 10 Jahre!
```


----------



## Psynosis (14. April 2008)

die session_id bleibt aber immernoch in meiner db erhalten!

oder kann mir jemand sagen wie ich sehen kann welche zeit er mit dem code


```
// User ohne Autologin ausloggen 
$sql = "UPDATE users 
SET UserSession = NULL, 
IP = NULL 
WHERE 
'".(time()-(60*30))."' > lastchange"; 
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
```

an den server giebt


----------



## alex130 (15. April 2008)

Hi
Dazu hätte ich auch gleich eine Frage, ich will bei meinem Loginscript auch, dass man z.B. nach 5 min. inaktivität rausfliegt, also hab ich es so gemacht:

```
$last_activity = time() - 300;
if($user_data->user_last_activity < $last_activity)
{
...
```
Allerdings wird meine Session immer gekillt, egal ob ich in den letzten 5 Minuten etwas gedrückt hab, oder nicht.
Kann mir jemand sagen, woran das liegt?
Danke


----------



## Flex (15. April 2008)

Wird denn user_last_activity in deinem $user-data Objekt richtig ausgelesen?
Hast du es mal testweise ausgegeben?


----------



## alex130 (15. April 2008)

Oh man, ich bin so blöd...
Normalerweise, gebe ich es immer aus, aber diesmal hab ich total drauf vergessen, es lag wirklich daran... ^^
Danke für deine rasche Hilfe.


----------



## alex130 (16. April 2008)

Hi
eine Frage hab ich noch und zwar, wie könnte ich machen, dass immer nur ein User pro Account eingeloggt sein kann?
Evtl. die IP beim Login in der Db speichern und dann die derzeitige IP mit der aus der DB prüfen?
Danke


----------



## kalle123456 (16. April 2008)

alex130 hat gesagt.:


> Hi
> eine Frage hab ich noch und zwar, wie könnte ich machen, dass immer nur ein User pro Account eingeloggt sein kann?
> Evtl. die IP beim Login in der Db speichern und dann die derzeitige IP mit der aus der DB prüfen?
> Danke



Hallo,

nimm doch einfach eine Spalte in der User Table dazu, z.B. is_activ. Beim Login wird der Flag auf 1 gesetzt und beim Ausloggen auf 0. Jetzt musst du nur noch den Flag beim einloggen prüfen.

Gruss


----------



## alex130 (16. April 2008)

Ok danke, so hab ich es jetzt gemacht und es funktioniert sogar einwandfrei.
Danke


----------



## kalle123456 (16. April 2008)

vergesse nicht wenn du deine Session löscht, oder sie abgelaufen ist den Flag auf 0 zu setzen.


----------



## alex130 (19. April 2008)

Hi
Ich bin gerade erst drauf gekommen, dass meine Abfrage gar nicht funktioniert, also um `eingeloggt` wieder auf 0 zu setzen.
Wie müsste die Abfrage aussehen, damit er die Abgelaufenen Session bzw. das eingeloggt bei den Usern wieder auf 0 setzt?
Danke


----------



## Chaosengel_Gabriel (19. April 2008)

```
UPDATE
Tabellenname
SET
Spalte = 'Wert'
WHERE
Bedingung für Datensatz
```


----------



## alex130 (19. April 2008)

Hi
Danke aber das wusste ich auch, ich meinte, wie die Bedingung aussehen muss?
Danke


----------

