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."
37 svar · 788 visningar · startad av Alpha II
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
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."
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."
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
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]
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
Jo, men vad skall du med det till?
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
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]
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
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
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
Jag skulle ha sparat time() i databasen, då blir det lättare att jämföra :)
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]
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