Hallo,

Jullie hebben de vraag misschien al vaker voorbij zien komen, maar ik kon niks vinden.

Ik wil dus een online leden lijst voor mijn site maken, nou heb ik het volgende function gemaakt om mensen die online zijn toe te voegen aan de mysql datebase:


<?php
function set_online($user_id, $page) {
$user_id = (int)$user_id;
$page = sanitize($page);

if (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users_online` WHERE `user_id` = '$user_id' "), 0) == 0)
{
mysql_query("INSERT INTO `users_online` (user_id, online, page) VALUES ('$user_id', NOW(), '$page')");
} else {
mysql_query("UPDATE `users_online` SET `online` = NOW(), `page` = '$page' WHERE `user_id` = $user_id");
}
}
?>

Dit werkt allemaal perfect, maar nou moet ik dus als iemand langer als een paar minuten niet op de site zit die persoon uit de users_online tabel gooien. Ik sla datum en tijd op met NOW() zoals jullie kunnen zien. Nou moet ik die tijd dus gaan vergelijken of misschien is er een andere simpelere manier. Ik zou niet weten hoe ik dit aan zou moeten pakken. ben nog maar een beginner. Iemand ideeën?

alvast bedankt.
Je kunt ook van elke user steeds opslaan wanneer hij voor het laatst online was.

Dan staat er voor user X misschien in dat hij voor kerst 2013 het laatst online was.
Dat is niet erg want met


SELECT user_id
FROM users_online
WHERE online > NOW() - INTERVAL 10 MINUTE


krijg je precies die users die de afgelopen 10 minuten iets deden.

En bij elke actie op je pagina doe je dan


UPDATE users_online 
SET online = NOW()
WHERE user_id = '$userid'


En als je zorgt dat bij het aanmaken, elke user direct in die tabel staat, dan ben je er al
Oke dat is duidelijk.

Kan ik dan beter de tabel users_online laten vervallen en gewoon in de users tabel 2 kolommen toevoegen genaamd online en page?

Mvg joey


[size=xsmall]Toevoeging op 07/01/2014 20:23:10:[/size]

Nog een laatste vraag: Is het erg als ik een functie mee loop net als hier onder, of is het beter om het anders te doen
<?php
$result = mysql_query("SELECT `user_id` FROM `users_online` WHERE online > NOW() - INTERVAL 10 MINUTE");
$num_users = mysql_num_rows($result);

echo '<table> We hebben ' . $num_users . ' leden online.';
while ($row = mysql_fetch_assoc($result)) {
echo '<tr><td>'. username_from_user_id($row['user_id']) .'</td></tr>';
}
echo '</table>';
?>
Als die functie elke keer een query doet om de username te vinden, dan is het efficenter om dat direct in je query te doen. Simpele join.

Je kunt qus caching beter niet steeds in de user tabel rommelen.
die tabel is best wel statisch verder en de data gebruik je regelmatig. Je kunt die dan beter niet steeds aanpassen, zodat mysql ook niet steeds besluit om de hele tabel als veranderd te beschouwen
En je gaat ook niet alle id,'s ophalen en daarna het aantal rijen tellen, maar gebruikt dan SELECT COUNT(*)
Nou heb ik dit,(begrijp niet zoveel van die "join query")en ik weet niet hoe ik er nou nog een SELECT COUNT van maak?

@ivo... Uit je onderste stukje versta ik dus dat ik de boel beter apart kan houden en niet zoveel kolommen in users moet maken maar het een beetje moet op delen. (zoals ik het nu dus al deed met users_online)


<?php
$query = "SELECT users.username, users_online.user_id " . "FROM users, users_online " . "WHERE users.user_id = users_online.user_id AND online > NOW() - INTERVAL 10 MINUTE";
$result = mysql_query($query) or die(mysql_error());

echo '<table> We hebben ????? leden online.';
while($row = mysql_fetch_array($result)){
echo '<tr><td>'. $row['username'] .'</td></tr>';
}
echo '</table>';
?>
Als je al de leden die online zijn (bv 5000???) wilt displayen op de pagina, kan je dit natuurlijk dan met een querie ophalen en dan met num_rows het aantal weergeven.

Ivo P op 07/01/2014 20:50:17

Je kunt qus caching beter niet steeds in de user tabel rommelen.
die tabel is best wel statisch verder en de data gebruik je regelmatig. Je kunt die dan beter niet steeds aanpassen, zodat mysql ook niet steeds besluit om de hele tabel als veranderd te beschouwen

Let wel op dat query caching op server niveau gebeurt, en dat alleen bij query's die exact (teken voor teken) hetzelfde zijn het resultaat uit de cache gehaalt wordt.

Het werkt wel maar is die "join query" zo goed geschreven of had ik dat beter anders kunnen doen?
Ja die is goed geschreven, en het kan anders maar dat hoeft niet per definitie beter te zijn.
Dat is meer persoonlijke voorkeur en/of gewoonte
@Ger Zou je mij misschien die andere manier kunnen laten zien?

Mvg Joey.

SELECT users.username, users.user_id
FROM users
INNER JOIN users_online ON users.user_id = users_online.user_id
WHERE last_activity > NOW() - INTERVAL 10 MINUTE

Of iets korter:

SELECT users.username, users.user_id
FROM users
JOIN users_online USING (user_id)
WHERE last_activity > NOW() - INTERVAL 10 MINUTE

Reageren