[PHP] Check of sessie ID bestaat van andere user

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Is het mogelijk met PHP te checken of een sessie ID bestaat?

Dit moet ook kunnen als de sessie niet van de ingelogde gebruiker is.

Dus stel ik heb een website waar drie users ingelogd zijn. Nu wil ik kunnen checken als ik onder user 1 ingelogd ben of user 3 zijn sessie heeft lopen (en dus is ingelogd). Ik heb de beschikking over zijn sessie ID (uit mysql database).

Ik heb zelf al wat zitten pielen maar zonder resultaat (uiteindelijk ook stom want je kan de return van een functie niet gebruiken in een ifje 8)7 |:( )

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$sql = mysql_query("SELECT session_id FROM users_online WHERE is_playing = '0'");
while($result = mysql_fetch_array($sql))
{
$sessid = $result['session_id'];
if(isset(session_id($sessid)))
{
echo "deleten<br />";
echo "" . $result['session_id'];
}
}
?>


Wie kan me helpen :) ?

[ Voor 6% gewijzigd door Verwijderd op 07-09-2005 20:51 . Reden: Uiteraard al gezocht e.d. ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Note: By default, all data related to a particular session will be stored in a file in the directory specified by the session.save_path INI option. A file for each session (regardless of if any data is associated with that session) will be created. This is due to the fact that a session is opened (a file is created) but no data is even written to that file.
Daar zou je iets mee kunnen doen. Wat je ook kan doen: sla de tijd op waarop een gebruiker voor het laatst actief was (dus een pagina opende). Als je dan een pagina opvraagt, en de gebruiker is langer dan een bepaalde tijd inactief (een kwartier bijvoorbeeld), dan is ie niet meer online.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • b19a
  • Registratie: September 2002
  • Niet online
Uhm, wat voor systeem gebruik je? Hoe slaat dat systeem gegevens op in de database?

We need more information!!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op woensdag 07 september 2005 @ 21:03:
[...]

Daar zou je iets mee kunnen doen. Wat je ook kan doen: sla de tijd op waarop een gebruiker voor het laatst actief was (dus een pagina opende). Als je dan een pagina opvraagt, en de gebruiker is langer dan een bepaalde tijd inactief (een kwartier bijvoorbeeld), dan is ie niet meer online.
Daar heb ik al effe naar zitten kijken, maar ik heb nu al een half uur mn browser dicht, en die files bestaan nog steeds (met inhoud). :(

Het gaat om een soort lobby voor een online game. Je kan dus zien wie er online is. Maar zodra iemand zn browservenster dichtgooit, is hij in principe offline dus kan je hem niet meer uitnodigen voor een game. Zodra je inlogt wordt er in een MySQL database de volgende gegevens geknalt:

Nickname
Session ID
Is_playing (of de user aan het spelen is of niet, default 0 natuurlijk).

Als de user "normaal" uitlogt dan worden de gegevens uit de database verwijderd, zodat hij niet meer in de lobby zichtbaar is, maarja als de user zn venster dichtgooit gebeurt dit niet en lijkt het of de user nog online is.

Vandaar dat ik opzoek ben naar een oplossing hiervoor :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Lees de tweede oplossing in mijn post nog eens. Dat is ook de manier waarop het meestal aangepakt wordt, voor zover ik weet. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • b19a
  • Registratie: September 2002
  • Niet online
Bij elke pagina refresh zou je de row kunnen updaten in je tabel ("lastUpdateTime"=time()), en dan kun je bijvoorbeeld elke sessie ouder dan 1 minuut ("lastUpdateTime" < time()-60) kunnen weggooien (hangt af van hoe vaak refreshes worden uitgevoert natuurlijk).

offtopic:
Spuit 11,5 dus ;)

[ Voor 11% gewijzigd door b19a op 07-09-2005 21:24 ]


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 23:05
PHP:
1
echo "" . $result['session_id'];


Je kan hier ook
PHP:
1
echo $result['session_id'];

van maken :)
Voor de volgende keer ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op woensdag 07 september 2005 @ 21:23:
Lees de tweede oplossing in mijn post nog eens. Dat is ook de manier waarop het meestal aangepakt wordt, voor zover ik weet. ;)
@ -nMe-
Dat werkt idd wel, maar niet voor een gamelobby :) Want als een user tien minuten niet actief is, krijg je dikke errors als je die user voor een game uitnodigd (de user is dan nog 10 min "fake" online).

@Bouke
Dat is idd misschien wel een oplossing, gaat ook richting die van -nMe-. Dan zou ik van dat kwartier van -nMe- 10 secs moeten maken ofzo. Kan ik dan met bijv. session_unset een sessie deleten die niet van de ingelogde user is?

@ID-College
Iss idd waar, was ook maar een snel probeerseltje :Y)

[ Voor 3% gewijzigd door Verwijderd op 07-09-2005 21:29 ]


Acties:
  • 0 Henk 'm!

  • b19a
  • Registratie: September 2002
  • Niet online
Verwijderd schreef op woensdag 07 september 2005 @ 21:29:
[...]
@Bouke
Dat is idd misschien wel een oplossing, gaat ook richting die van -nMe-. Dan zou ik van dat kwartier van -nMe- 10 secs moeten maken ofzo. Kan ik dan met bijv. session_unset een sessie deleten die niet van de ingelogde user is?
session_* functies gebruik je alleen als je het ingebouwde sessie-systeem van PHP gebruikt. Gebruik je echter je eigen/ander sessie-systeem, dan zul je het anders moeten oplossen:
SQL:
1
DELETE FROM sessies WHERE lastUpdate<NOW()-60
(iets in deze richting)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmz, ik ga even wat in elkaar kleien met die refresh meuk :)

Thanx voor de replies en zodra het werkt post ik het hier even :)

Edit: andere suggesties zijn altijd welkom natuurlijk :P

[ Voor 19% gewijzigd door Verwijderd op 07-09-2005 21:49 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Het sluiten van een venster kun je afvangen door in de html <body> tag het javascript 'unload' event te gebruiken. Het is niet 100% betrouwbaar, maar het is een extra methode om het offline gaan van users af te vangen
HTML:
1
<body onunload="tempImg = new Image(); tempImg.src = '/images/userOffline.php'">


Dit event triggert zodra een pagina wordt gesloten, dus ook bij het doorklikken naar een andere pagina (!!!).
Je kunt in 'userOffline.php' code opnemen welke registreerd dat de pagina is 'gesloten'. Als er niet binnen X seconden een nieuwe pagina is geopent, kun je ervan uit gaan dat de user offline is.

Verder kun je in je site een verbogen iframe plaatsen welke zich elke X seconden ververst. Elke user met een sessie ouder dan X seconden, is offline.

Verwijderd

stel dat je een frampje maakt met google-adds die je refreshed elke x seconden. In je systeem tel je het aantal refreshes sinds het inloggen (y). Als huidige_tijd - x*y = inlog_tijd is de speler online.

zo genereer je tevens extra inkomsten vanuit de add-views.

Toch?

Verwijderd

Topicstarter
Ondertussen ben ik een partij aan het kloten geweest, maar heb het nog niet werkende.

Ben aan het rommelen geweest met die refresh-oplossing:
PHP:
1
2
3
4
5
6
$id = $_SESSION['db_id'];

//debuggen
echo "ID is " . $id;

$sql = mysql_query("UPDATE users_online SET lastupdate = NOW()+1 WHERE id = '$id'") or die (include('include/error.php'));

NOW()+1 zodat er een timestamp-achtige string tevoorschijn komt, waarmee je kan rekenen.

Dan wordt er op elke pagina dit uitgevoerd:
PHP:
1
$sql = mysql_query("DELETE FROM users_online WHERE lastupdate < NOW()-20") or die (include('include/error.php'));

Dit gaat best vaak fout, ik snap er niks van, want random gooit ie alle online users eruit :S.


Het sluiten van een venster kun je afvangen door in de html <body> tag het javascript 'unload' event te gebruiken. Het is niet 100% betrouwbaar, maar het is een extra methode om het offline gaan van users af te vangen


Dat is idd ook een oplossing, daar was ik al mee bezig geweest, maarja PHP en JS is niet te combineren. Maar zo kan het dus ook, ik ga ermee aan de slag.


stel dat je een frampje maakt met google-adds die je refreshed elke x seconden. In je systeem tel je het aantal refreshes sinds het inloggen (y). Als huidige_tijd - x*y = inlog_tijd is de speler online.

zo genereer je tevens extra inkomsten vanuit de add-views.


Kan ook :) Maar rekenen met tijd is mij nog niet gelukt. De PHP functie date() bijv. geeft een string terug. Dan kan je daar wel weer een int van maken, maar dan krijg je een hele andere waarde terug. Als iemand mij hier ook meer over kan vertellen graag. En die knaken voor die Google-Ads... Het is een opdracht voor school dus... :P

Ik piel verder, suggesties altijd welkom :)

[ Voor 6% gewijzigd door Verwijderd op 08-09-2005 17:44 ]


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je kan voor de date ook gewoon de functie time() gebruiken :?
Overigens kan je met JS (zoals al eerder aangegeven) wel degelijk iets. Gewoon een klein venstertje openen, en daarin de huidige sessie uit de database gooien. Dat gebruikt de Postbank bijvoorbeeld bij het uitloggen bij het online bankieren.

[ Voor 56% gewijzigd door MueR op 08-09-2005 21:42 ]

Anyone who gets in between me and my morning coffee should be insecure.


Verwijderd

Topicstarter
MueR schreef op donderdag 08 september 2005 @ 21:41:
Gewoon een klein venstertje openen, en daarin de huidige sessie uit de database gooien.
Dat is idd een hele goede.

Ben wegens tijdgebrek nog verder niet opgeschoten, maar ik hou jullie op de hoogte ;)

Thanx zover iig _/-\o_ .

Edit:

Updateje :)

Heb het nu deels werkende.

Heb nu een frameset (rows="1,*") waarin die ene pixel een PHP pagina bevat. Hier staat in:
PHP:
1
2
3
4
<?php
$session_id = $_SESSION['session_id'];
?>
<body onUnload="javasript:window.open('logoff.php?user=<?php echo $session_id; ?>');">

, en in logoff.php:
PHP:
1
2
3
4
5
$id = $_GET['user'];
$sql = mysql_query("DELETE FROM users_online WHERE session_id = '$id'") or die(include('include/error.php'));
session_destroy();
echo "User trashed!";
echo "<script language=\"javascript\"> self.close(); </script>";

En dat werkt prima! Alleen jammer dat FF de popup blokt, in IE werkt het wel goed.

[ Voor 50% gewijzigd door Verwijderd op 08-09-2005 22:26 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
frickY schreef op donderdag 08 september 2005 @ 10:15:
Het sluiten van een venster kun je afvangen door in de html <body> tag het javascript 'unload' event te gebruiken. Het is niet 100% betrouwbaar, maar het is een extra methode om het offline gaan van users af te vangen
HTML:
1
<body onunload="tempImg = new Image(); tempImg.src = '/images/userOffline.php'">


Dit event triggert zodra een pagina wordt gesloten, dus ook bij het doorklikken naar een andere pagina (!!!).
Je kunt in 'userOffline.php' code opnemen welke registreerd dat de pagina is 'gesloten'. Als er niet binnen X seconden een nieuwe pagina is geopent, kun je ervan uit gaan dat de user offline is.

Verder kun je in je site een verbogen iframe plaatsen welke zich elke X seconden ververst. Elke user met een sessie ouder dan X seconden, is offline.
This does the trick! Werkt perfect, super, dankjewel _/-\o_ _/-\o_ !
Pagina: 1