webForumDet fria alternativet

utloggning

37 svar · 788 visningar · startad av Alpha II

Alpha IIMedlem sedan maj 20002 579 inlägg
#1

Hej!
Jag håller på med ett community (hatar egentligen såna men har inget annat att göra... ;) )

När man loggar in ändras värdet status i en mysql databas till online så att man ska kunna se vilka andra som är online.

Problemet är att om man inte loggar ut så som det är tänkt att man ska göra (klickar på logga ut) utan bara går till en annan sida eller stänger browsern så står det fortfarande att man är online. Hur får jag värdet i databasen att ändras om man inte är aktiv under ett visst antal minuter? :q

------------------
Home sweet home

Gislaved.netMedlem sedan juni 20001 274 inlägg
#2

Jag har bestämt för mig att det här har diskuterats tidigare... har du testat att söka?

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Alpha IIMedlem sedan maj 20002 579 inlägg
#3

Ja men jag har inte hittat precis vad jag ville ha :(

------------------
Home sweet home

Gislaved.netMedlem sedan juni 20001 274 inlägg
#4

Kan det här vara något, kanske? http://cgi.webforum.nu/wf/Forum12/HTML/000296.html

------------------
Gislaved.net
"Tänk på vad du säger så att du inte säger vad du tänker."

Alpha IIMedlem sedan maj 20002 579 inlägg
#5

Hur ska jag göra då? Jag har 2 session som innehåller en variabel om man är inloggad ellèr inte och användarnamnet. Så man är ju inte inloggad längre när man stänger browsern men hur ska jag med den där koden göra så att värdet i databasen ändras? *fattar ine*

------------------
Home sweet home

nicclasMedlem sedan feb. 20001 061 inlägg
#6

Så här kan man göra ett inloggningssystem med "sessions", tror jag.

Jag har skapat 5 st filer: login.php4, verify.php4, secret.php3, secret2.php4 och logout.php4.

Jag har varit slarvig med HTML-koden, men sidorna skall fungera i alla fall.

En demo finns på http://www.nic-sys.se/gaboPHP/login.php4

login.php4

Välkommen till nic-gemenskapen.
<form name="logga" method="post" action="verify.php4">
Skriv lösenordet "hej":
<input type="password" name="pass">
<input type="submit" value="continue">
</form>

verify.php4

<? 
if ($pass=="hej"){
session_start(); 
session_register("ActiveAt"); 
session_register("pass");
$ActiveAt=time();
?>
Välkommen, du har nu loggat in på vår genemskap.<br><br>

Nu när du är inloggad kan du besöka våra hemliga sidor :)
<a href="http://www.nic-sys.se/gaboPHP/secret.php4">
Här</a> finns den första sidan secret.php4.
<?
}else{
?> 
Inloggningen misslyckades, gå tillbaka och prova igen.
<?
}
?>

secret.php4

<? 
session_start(); 
if(!isset($ActiveAt)){
echo "Tyvärr, denna sida kan bara ses om du är inloggad.<br>";
exit;
}
if(isset($ActiveAt) && time()-$ActiveAt>60){
echo "Din session har runnit ut:)";
echo " Logga in igen <a href=http://www.nic-sys.se/gaboPHP/login.php4>här</a>.";
exit;
}
$ActiveAt=time(); echo "<i>Uppdaterar sessionen!</i><br><br>";
?>
Hej, <br><br>
Här finns den hemiliga informationen: salccin<br><br>
Du kan också få fler hemligheter på sidan 
<a href="http://www.nic-sys.se/gaboPHP/secret2.php4">secret2.php4</a>.

secret2.php4

<? 
session_start(); 
if(!isset($ActiveAt)){
echo "Tyvärr, denna sida kan bara ses om du är inloggad.<br>";
exit;
}
if(isset($ActiveAt) && time()-$ActiveAt>60){
echo "Din session har runnit ut:)";
echo " Logga in igen <a href=http://www.nic-sys.se/gaboPHP/login.php4>här</a>.";
exit;
}
$ActiveAt=time(); echo "<i>Uppdaterar sessionen!</i><br><br>";
?>
Hej, <br><br>
Här finns den hemiliga informationen: salccin blir nicclas baklänges.<br><br>
Läs hemligheter på den första sidan 
<a href="http://www.nic-sys.se/gaboPHP/secret.php4">secret.php4</a> igen om du vill.<br><br>

Klicka <a href="http://www.nic-sys.se/gaboPHP/logout.php4">här</a> för att logga ut!

logout.php4

<? 
session_start(); 
session_destroy(); 
?>
Du har nu loggat ut.<br>
Försök komma på de hemliga sidorna nu,
<a href="http://www.nic-sys.se/gaboPHP/secret2.php4">secret.php4</a> och
<a href="http://www.nic-sys.se/gaboPHP/secret2.php4">secret2.php4</a>.

Man loggar ut genom att gå till sidan logout.php4. Gör man inte det så kommer inloggningen att sluta fungera efter 60 sekunder, och du måste logga in igen.

Naturligtvis måste PHP4 köras. Jag har aldrig provat sessions förut så detta går säkert att göra säkrare/bättre, kanske?

Red: Aj då, du kanske vill ändra i din databas också... Ja då blir du nog så illa tvungen att komplettera med en lista över användare som laddat någon "hemlig" sida den senaste miuten som lagras på servern. Kod för detta finns i trådan som Gislaved gav ovan.

/nicclas - www.nyhetsrubriker.com

[Redigerat av nicclas den 20 apr 2001]

[Redigerat av nicclas den 20 apr 2001]

Alpha IIMedlem sedan maj 20002 579 inlägg
#7

Går det inte på nått sätt göra så ett en kod körs tex 1 gång i minuten? :q

------------------
Home sweet home

nicclasMedlem sedan feb. 20001 061 inlägg
#8

Jo, men vad skall du med det till?

Alpha IIMedlem sedan maj 20002 579 inlägg
#9

Man kan ju kolla om användaren har gjort nått inom tex 10 min och om den inte har det så ändras värdet i databasen till offline. :)

------------------
Home sweet home

nicclasMedlem sedan feb. 20001 061 inlägg
#10

Och hur har du tänkt att "kolla om användaren har gjort nått inom tex 10 min"?

Jag misstänker att du behöver koden på http://cgi.webforum.nu/wf/Forum12/HTML/000296.html för att göra detta, eller?

Tror knappast att sessions (med det stöd som det nu finns för sessions i PHP 4) kommer att lösa dina problem :(

Red: Vänta, det går nog. Listan som används i den kod som jag hänvisar till ovan gör du om till en lista med användarnamn och tidstämpel. Denna lista kan du nu lagra i en session istället för den textfil som används i koden tidiagre. Lycka till ;)

/nicclas

[Redigerat av nicclas den 21 apr 2001]

Alpha IIMedlem sedan maj 20002 579 inlägg
#11

Finns det nån funktin för att få fram vilken tid det är så som jag har gjort fungerar det inte, eller är det nått annat fel i koden?

checkuser.inc.php

<?php
session_start();
$time = getdate(time());
$time = "$time[hours]:$time[minutes]:$time[seconds]";

mysql_connect($database,$db_username,$db_password);
mysql_select_db($db);

function logedin() {
$query = "SELECT status FROM users WHERE username='$username'";
$result = mysql_query($query);
$status = mysql_fetch_array($result);

if ($status[0]=="online")
 return true;
else
 return false;
}

if(logedin()) {
 $query = "UPDATE users SET lactive='$time' WHERE username='$username'";
 $result = mysql_query($query);
}

$query = "SELECT username FROM users WHERE status='online'";
$result = mysql_query($query);

while($name = mysql_fetch_array($result)) {
  $query = "SELECT lactive FROM users WHERE status='$name[0]'";
  $result2 = mysql_query($query);
  $lactive = mysql_fetch_row($result2);
  if($lactive[0]>$time-60*20) {  //HÄR BLIR DET FEL! :(
   $query = "UPDATE users SET status='offline' WHERE username='$name[0]'";
   $update = mysql_query($query);
  }
}

?>

------------------
Home sweet home

sgtpepperMedlem sedan apr. 20005 524 inlägg
#12

Kör ett schemalagt jobb som går igång en gång i minuten och uppdaterar onlinestatusen.

Du kan också lägga en motsvarande funktion på en välbesökt sida. När någon begär denna sida så rensas ej aktiva medlemmars onlinestatus bort.

------------------
"Med ett schysst järnrör slår man hela världen med häpnad" - Socker-Conny

stevenetMedlem sedan juni 2000985 inlägg
#13

Varför använder du inte bara lactive-kolumnen för att kontrollera om användaren är inloggad?

------------------
SteveNet
------------------
- Det var motgräs!
Roland Sandberg förklarar varför han missade öppet mål.

Alpha IIMedlem sedan maj 20002 579 inlägg
#14

Hur kontroller man att ett timedate datum är 20 minuter gammal? För mig fungerar det inte att skriva: if(lactive[0]<$timeout)

<?php
	session_start();
	$time = getdate(time());
	$timenow = "$time[year]-$time[mon]-$time[mday] $time[hours]:$time[minutes]:$time[seconds]";
	$minutes = $time[minutes]-20;
	$timeout = "$time[year]-$time[mon]-$time[mday] $time[hours]:$minutes:$time[seconds]";
	$online = false;

	mysql_connect($database,$db_username,$db_password);
	mysql_select_db($db);

	#Kollar om användaren är online isf. $status = true!
	$query = "SELECT status FROM users WHERE username='$username' and password='$password'";
	$result = mysql_query($query);
	$status = mysql_fetch_array($result);

	if ($status[0]=="online")
		$online = true;
	else
		$online = false;

	if($online) {
		$query = "UPDATE users SET lactive='$timenow' WHERE username='$username'";
		$result = mysql_query($query);
	}

	$query = "SELECT username FROM users WHERE status='online'";
	$result = mysql_query($query);

	while($name = mysql_fetch_array($result)) {
		$query = "SELECT lactive FROM users WHERE status='$name[0]'";
		$result2 = mysql_query($query);
		$lactive = mysql_fetch_row($result2);
		if($lactive[0]==$timeout) {  //HÄR BLIR DET FEL! :(
			$query = "UPDATE users SET status='offline' WHERE username='$name[0]'";
			$update = mysql_query($query);
		}
	}

	if(!$online)
		Header("Location: index.php");

?>

------------------
Home sweet home

nicclasMedlem sedan feb. 20001 061 inlägg
#15

Jag skulle ha sparat time() i databasen, då blir det lättare att jämföra :)

stevenetMedlem sedan juni 2000985 inlägg
#16

fummel, ta bort.
------------------
SteveNet
------------------
- Det var motgräs!
Roland Sandberg förklarar varför han missade öppet mål.

[Redigerat av stevenet den 22 apr 2001]

stevenetMedlem sedan juni 2000985 inlägg
#17

Det var det jag menade, fast jag missade att han inte timestamp.

<?

$min="20";
$sek=$min*60;
$tid=time();

$found = mysql_num_rows(mysql_query("select * from users where username ='$username' and password = '$password'"));

if ($found) {
$user = mysql_fetch_array(mysql_query("select * from users where username ='$username' and password = '$password'"));
$online=$user[lactive]+$sek;
if ($tid<$online) {
mysql_query("UPDATE users SET lactive='$tid' where username ='$username' and password = '$password'");
echo "Inloggad.";
}
else {
echo "Du har inte varit aktiv på 20 minuter!";
}
}
else {
echo "Fel lösenord och/eller användarnamn.";
}
?>

------------------
SteveNet
------------------
- Det var motgräs!
Roland Sandberg förklarar varför han missade öppet mål.

[Redigerat av stevenet den 22 apr 2001]

Alpha IIMedlem sedan maj 20002 579 inlägg
#18

Ska lactive vara timestamp, eller?

------------------
Home sweet home

stevenetMedlem sedan juni 2000985 inlägg
#19

Jupp

------------------
SteveNet
------------------
- Det var motgräs!
Roland Sandberg förklarar varför han missade öppet mål.

Alpha IIMedlem sedan maj 20002 579 inlägg
#20

Jag skrev om koden lite men nu får jag parse error på rad 23! :(

<?php
	session_start();
	$min="20";
	$sek=$min*60;
	$tid=time();

	mysql_connect($database,$db_username,$db_password);
	mysql_select_db($db);

	$found = mysql_num_rows(mysql_query("select * from users where username = '$username' and password = '$password'"));

	if ($found) {
		mysql_query("update users set lactive = '$tid' where username = '$username'");
		$logedin=true;
	}
	else {
		$logedin=false;
	}

	while($user = mysql_fetch_array(mysql_query("select * from users where status = 'online'))) {
		$online=$user[lactive]+$sek;
		if ($tid>$online)
			mysql_query("update users set status='offline' where username = '$user[username]'");
	}

?>

------------------
Home sweet home

137 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
133 ms — hämta tråd, inlägg och bilagor (db)