webForumDet fria alternativet

utloggning

PHPur PHP

37 svar · 788 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#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

Medlem sedan juni 20001 521 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."

Medlem sedan maj 20002 993 inlägg
#3

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

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

Medlem sedan juni 20001 521 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."

Medlem sedan maj 20002 993 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

Medlem sedan feb. 20001 050 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]

Medlem sedan maj 20002 993 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

Medlem sedan feb. 20001 050 inlägg
#8

Jo, men vad skall du med det till?

Medlem sedan maj 20002 993 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

Medlem sedan feb. 20001 050 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]

Medlem sedan maj 20002 993 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

Medlem sedan apr. 20007 588 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

Medlem sedan juni 20001 251 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.

Medlem sedan maj 20002 993 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

Medlem sedan feb. 20001 050 inlägg
#15

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

Medlem sedan juni 20001 251 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]

Medlem sedan juni 20001 251 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]

Medlem sedan maj 20002 993 inlägg
#18

Ska lactive vara timestamp, eller?

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

Medlem sedan juni 20001 251 inlägg
#19

Jupp

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

Medlem sedan maj 20002 993 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

138 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)