webForumDet fria alternativet

Online

6 svar · 360 visningar · startad av Jesper2

Jesper2Medlem sedan dec. 200475 inlägg
#1

Jag vill visa vilka medlemmar på min sida som är online för tillfället. Jag har ett fält i databasen som heter "online" där tidpunkten för senaste gången deras meny uppdaterades är inskickat. Menyn uppdateras varje minut. Nu har jag ganska feta problem eftersom jag inte är så duktig, men jag behöver hjälp med rubb och stubb kan man säga ^^

Vilket format ska jag ha på tiden som skickas in i "online"?
Hur räknar jag ut vilka användare som inte fått menyn uppdaterad den senaste minuten?

Just nu skickas tiden in i databasen i det här formatet:
20050112103023
(2005-01-12 kl: 10:30:23)

Just nu ser det ut såhär, det fungerar men är VÄLDIGT instabilt och jag tror inte det kommer fungera i oktober (då månaden istället för 01, 04, 05 osv blir 10, 11, 12..):


// Det här är online.php
				$sqlonline = mysql_query("SELECT online FROM member WHERE nick='$sender'");
				$resultonline = mysql_fetch_array($sqlonline);
				
				$lastonline = $resultonline['online'];
				$onlinetime = date("YmdHis");
				
				$month1 = substr($lastonline,0,0);
				
				if($month == 0){
					$lastonline = substr($lastonline,9);
					$onlinetime = substr($onlinetime,9);
					
					$lastonline = $lastonline + 00200;
					
					if(($lastonline > $onlinetime) AND ($lastonline != 128)){
						$useronline = "<img src='grafik/online.jpg' style='border: 0px;'>";
					}
					else{
						$useronline = "<img src='grafik/offline.jpg' style='border: 0px;'>";
					}
				}
				
				else{
					$lastonline = substr($lastonline,8);
					$onlinetime = substr($onlinetime,8);
					
					$lastonline = $lastonline + 000200;
					
					if(($lastonline > $onlinetime) AND ($lastonline != 128)){
						$useronline = "<img src='grafik/online.jpg' style='border: 0px;'>";
					}
					else{
						$useronline = "<img src='grafik/offline.jpg' style='border: 0px;'>";
					}
				}

Är det någon som förstår någonting?
Jag inkluderar den här sidan i de sidor som behöver onlinescriptet, och det gör jag såhär:

// Sidan som online.php används i
$sender = $activenick;
include("val/online.php");

if($useronline == "<img src='grafik/online.jpg' style='border: 0px;'>"){
						
echo $useronline;
echo " Online";
}
else{
echo $useronline;
echo " Offline";
}

Det MÅSTE finnas ett smidigare sätt att lösa det hela på.
Och förresten:
Om någon verkligen orkar/klarar av att lösa mitt problem så står jag i evig tacksamhetsskuld, och jag har faktiskt en möjlighet att återgälda det ;)

aasahMedlem sedan mars 20034 471 inlägg
#2

Enklast är nog om du låter ditt databasfält vara av typen DATETIME. Då har du nämligen möjlighet att använda databasens inbyggda funktioner och jämföra om tiden > 50 min (eller vad du vill). Att sköta det med stränghantering är ingen bra idé!

Jag hade själv jätteproblem med att förstå datum- och tidhanteringen i PHP/SQL från början. Möjligen kan du få hjälp av denna tråd, där andra förklarade för mig. Visserligen handlar det om datum som är några dagar gamla, men själva idén är ändå densamma för timmar.

(_ Att jag använde DATE och inte DATETIME berodde på att det var antal dagar jag var ute efter. Om D är DATETIME borde det bli:
SELECT * FROM tabell WHERE D > DATE_SUB( NOW( ) , INTERVAL 50 MINUTE ) _)

Jesper2Medlem sedan dec. 200475 inlägg
#3

Woe shit vad det skulle underlätta!
Min hjärna har hoppat ur led för tillfället, men hur skulle jag kunna utnyttja dessa funktioner på ett bra sätt då?

Verkligen döbussigt att folk ställer upp, feta creds till er alla!

Jesper2Medlem sedan dec. 200475 inlägg
#4

Någon som har ett förslag på hur jag kan använda det "aasah" föreslog?

ForsbergMedlem sedan juni 200454 inlägg
#5

Använd unixtid istället. Det är det absolut smidigaste sättet att spara tid på samt att det är kompatibelt med alla databaser på marknaden.

aasahMedlem sedan mars 20034 471 inlägg
#6

Låt oss säga att vi är intresserade av ett fåtal saker om våra medlemmar: IDnr, namn, epost, lösenord och huruvida de är online eller ej. Högst troligtvis är du intresserad av fler saker (*), men för att förenkla så mycket det går. Det senare håller vi reda på genom att hela tiden lagra tiden för senaste gången en sida laddas. Vår databastabell blir då: (tex)

CREATE TABLE Medlem (
 ID INT PRIMARY KEY auto_increment NOT NULL,
 Namn VARCHAR(40) NOT NULL UNIQUE,
 Epost VARCHAR(40) NOT NULL UNIQUE,
 Pass CHAR(32) NOT NULL,
 SenAktiv DATETIME)

I detta exempel säger vi att ID är nyckelvärdet, och detta kommer databasen snällt att räkna upp åt dig. Du behöver/ska aldrig lägga in något på denna plats. Varje ny medlem får ett högre heltalsvärde än personen före. Vidare får fälten Namn, Epost och Pass inte vara tomma - de första två får heller inte förekomma mer än en gång i tabellen. Pass bör inte lagras rakt av, det bör lagras i krypterad form exvis med md5, därav typen. SenAktiv är avsett att lagra den tid medlemmen senast laddade en sida.

Hur håller du koll på om man är inloggad eller ej? :q Via cookies, sessions eller på annat sätt? Inte helt oväsentligt om du vill ha exempelkod...

Låt oss anta att du har en funktion inne() i filen koll.php som antingen via cookies eller sessions kollar om en person är inloggad och lämnar tillbaka sant/falskt.

Sedan ser du till att samtliga filer som kan laddas på servern, högst upp börjar med att uppdatera SenAktiv. Exempel där $_SESSION används:

<?php 
session_start();  
include_once("/<sökvägen i fildir på servern - EJ URL:n>/koll.php");
if (inne()) {
  $sql = "UPDATE Medlem SET SenAktiv = NOW() 
          WHERE ID = ".$_SESSION['sess_id']; 
  //Förutsatt att du lagrar medlemmens ID i sess_id.
  mysql_query($sql) or die();
}

Sedan, på din login-sida hämtar du de som senast varit aktiva inom den tidsrymd som du vill betrakta någon som inloggad efter senaste hämtning av sida. Säg, tex 50 minuter:

$sql = "SELECT Namn FROM Medlem 
        WHERE SenAktiv > DATE_SUB(NOW( ) , INTERVAL 50 MINUTE )";

Kör och hämtar ut på vanligt vis.

Om något är oklart, återkom.

______
* : Du kan vilja lagra mer saker. Exvis en indikator som påslagen har effekten att vederbörande är "ban":ad och således ej får posta, tex.

Jesper2Medlem sedan dec. 200475 inlägg
#7

Till aasah:

Du är en ängel!

132 ms totalt · 3 externa anrop · v20260731065814-full.37765c92
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)