update database als session wordt verwijderd

Status
Niet open voor verdere reacties.

googlemuscle

Gebruiker
Lid geworden
26 nov 2013
Berichten
199
Hoi, ik ben bezig met een website waar je kunt inloggen en dan chatten met elkaar.

Als je inlogt wordt er via een query de gebruiker op 'online' gezet, zie hieronder:
[SQL]
$user = $_POST['gebruiker'];
$sth = $GLOBALS['pdo']->prepare('UPDATE gebruikers SET online = ? WHERE gebruiker = ?');
$sth->execute(array(1, $user));[/SQL]

Dat werkt prima maar mijn probleem is als volgt.

Wanneer men uitlogt via de uitlogknop word er keurig opnieuw een query uitgevoerd waar 'online' weer op 0 wordt gezet.
Alleen wanneer men gewoon de browser sluit wordt de session wel verwijderd maar er wordt dan geen query uitgevoerd waarin 'online' op 0 wordt gezet.

Heeft iemand hier een idee voor?
 
Jahoor, weet niet precies waarvan maar zal de belangrijkste geven:)

Login functie:
PHP:
function login(){
	$user = $_POST['gebruiker'];
	$pass = crypt($_POST['wachtwoord'], ' crypt even weggehaald;-) ');
	$sth = $GLOBALS['pdo']->prepare('SELECT * FROM gebruikers WHERE gebruiker = ? AND wachtwoord = ?');
	$sth->execute(array($user,$pass));
	$sth->setFetchMode(PDO::FETCH_OBJ);

	if ($sth->rowcount() == 1)
	{
		$row = $sth->fetch();
		$sth = $GLOBALS['pdo']->prepare('UPDATE gebruikers SET online = ? WHERE gebruiker = ?');
		$sth->execute(array(1, $user));
		$_SESSION['login'] = (array)$row;
		echo "success";
	}
	else {
		echo "ongeldige gebruikersnaam of wachtwoord";
	}
}

Vervolgens wordt men doorgestuur naar chat.php
Daar wordt gecontroleerd of men ingelogd is ja of nee.

Tevens include ik daar chatcontent.php
Die ziet er zo uit:
PHP:
<?php 
	include_once('config.php');
?>

<div id="gebruikers">
	<div class="titel">Wie is er online?</div>
	<?php 
		whoIsOnline(); 
	?>
</div>
<div id="chat">
	<?php 
		getChat();
	?>
</div>

De functies hierbij zijn:
PHP:
function whoIsOnline() {
	$sth = $GLOBALS['pdo']->prepare('SELECT gebruiker, avatar FROM gebruikers WHERE online = ?');
	$sth->execute(array(1));
	$sth->setFetchMode(PDO::FETCH_OBJ);

	while($row = $sth->fetch()) {
		echo '<div class="gebruiker">';
		echo $row->gebruiker;
		echo '</div>';
	}
}

function getChat() {
	$sth = $GLOBALS['pdo']->prepare('SELECT * FROM chats ORDER BY id desc LIMIT 20;');
	$sth->execute();
	$sth->setFetchMode(PDO::FETCH_OBJ);

	while($row = $sth->fetch()) {
		echo '<div class="message">';
		echo '<div class="avatar"></div>';
		echo '<p>'.$row->bericht.'</p>';
		echo '<div class="details">'.$row->auteur.', '.$row->tijd.'</div>';
		echo '<div class="clearfloat"></div>';
		echo '</div>';
	}
}

Om de chat te 'verversen' elke keer maak ik gebruik van jQuery.
[JS]
function refreshChat() {
$('#content').load("inc/chatcontent.php");
}
setInterval(refreshChat,10000);
[/JS]

Ik heb wel dat ik met javascript check wanneer iemand binnen 1 uur zijn muis niet beweegt (niet actief is dus) uitgelogd wordt.
Dit werkt dus ook alleen als diegene online op de website is.



Hopelijk heb je hier genoeg aan?
 
Ik bedoelde eigenlijk een stuk van je code. De code waar dit zou moeten gebeuren
 
Sorry ik denk dat mijn vraagstelling niet helemaal duidelijk is.
Ik heb hier geen code voor, het is juist mijn vraag of iemand een idee/ stuk code hiervoor heeft;)
 
om aan te geven welke gebruikers er online zijn zou je elke (tijdséénheid ??) een cronjob laten draaien
die dan alle gebruikers die iets gedaan hebben word er een waarde in de database gezet
dus één query die aangeeft waar de waarde true is daarna ga je alle waarden false zetten dan ga je bij ieder user die iets doet zijn user true zetten

hierdoor zal het altijd werken en kan je zelf frequentie bepalen denk eraan om ook een kill te plaatsen zo kan je iedereen laten killen geforceert uitlog voor upgrade
 
Bedankt voor het meedenken @kenikavanbis!

Dit zal alleen niet werken als men alleen de chat leest en niet actief deelneemt, klopt dat?
 
Het ziet er inderdaad niet echt heel makkelijk uit nee:p

Toch bedankt, zal er zeker naar kijken!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan