problème avec un while php

WRInaute impliqué
Bonjours, j'ai un problème avec ce code php :

Code:
$queryonline = doquery("SELECT charname FROM {{table}} WHERE UNIX_TIMESTAMP(onlinetime) >= '".(time()-600)."' ORDER BY charname", "users");
$onlinerow = mysql_fetch_array($queryonline); 

$query = doquery("SELECT * FROM {{table}} ORDER by regdate DESC LIMIT 5","users");
 
    $statistiques .= '';
 
    $count = 1;
 
    while ($row = mysql_fetch_array($query))
    {
	if($onlinerow['charname'] == $row['charname'])  {	$txt = 'En ligne';
    }else{
	$txt = 'Hors ligne';
	 }
    $statistiques .= '<br />- '.stripslashes($row['charname']).' <img src="images/login/'.$txt.'.gif" title="'.$txt.'" alt="'.$txt.'" />';
    }

Le soucis c'est que $onlinerow['charname'] est vérifié que sur 5 à cause du LIMIT5 de $query je suppose, pourtant il ne s'agit pas de la meme requete. Pouvez vous m'aider?
 
WRInaute discret
Salut,

A priori tu veux une liste de tous tes utilisateurs et savoir lesquesl sont en ligne.

Il faut donc récupérer la liste des utilisateurs et lors de l'affichage, verifier ceux identifiés dont la session a été mise à jours il y a moins de xx sex...

pas besoin de deux requetes pour ca....

Sebastien
 
WRInaute impliqué
Comment tu fais pour " verifier ceux identifiés dont la session a été mise à jours il y a moins de xx sex" . L'affichage des utilisateur je le fais sans problème, c'est juste pour la vérification que je n'arrive pas.
 
WRInaute discret
Dans ta base d'utilisateurs tu as un champ que tu mets à jour qui contient le timestamp unix mis a jour dans la gestion page à page de tes sessions.

c'est ce champ que tu verifies...


Amicalement


Sebastien
 
WRInaute impliqué
Ok je vois ce que tu veux dire, je met a jour un champ dans la table users avec le timestamp a chaque vous que quelqu'un ouvre une session. Mais pour la liste d'utilisateur, de quelle mannière je vérirife lesquels sont en ligne ou non?
 
WRInaute discret
Au lieu de faire la vérification sur le online time dans la requete, tu la fais dans le code php:

$queryonline = doquery("SELECT charname,onlinetime FROM {{table}} ORDER BY charname", "users");
while ($onlinerow = mysql_fetch_array($queryonline)) {
$username = $onlinerow['charname'];
$onlinetime = $onlinerow['onlinetime'];
if ($onlinetime >= time()-600)
$txt = 'En ligne';
else
$txt = 'Hors ligne';
$statistiques .= '<br />- ' . stripslashes($row['charname']) . ' <img src="images/login/' . $txt . '.gif" title="' . $txt . '" alt="' . $txt . '" />';
}
 
WRInaute impliqué
Oui mais à l'origine j'affichage les 5 dernier utilisateurs inscrit : $query = doquery("SELECT charname FROM {{table}} WHERE UNIX_TIMESTAMP(onlinetime) >= '".(time()-600)."' ORDER by regdate DESC LIMIT 5","users");


"by regdate " : donc avec ta requete:

$queryonline = doquery("SELECT charname,onlinetime FROM {{table}} ORDER BY charname", "users");

ca ne sera plus correct, et si on Limit à 5, ca ne vérifiera pas tous les utilisateur pour savoir qui est en ligne sur les 5 dernier inscrit.
 
WRInaute impliqué
Est ce que si dans la bdd le champ onlinetime contien 2006-09-24 18:51:30 ca fonctionnera avec time()-600 ?
 
WRInaute passionné
ça m'étonnerait mais je ne suis pas habitué aux fonctions de comparaison de date en mysql

perso je traite tout en unix timestamp et je te conseille de faire la même chose

rog
 
WRInaute discret
sff a dit:
ca ne sera plus correct, et si on Limit à 5, ca ne vérifiera pas tous les utilisateur pour savoir qui est en ligne sur les 5 dernier inscrit.

Excuse moi j'avais survolé le code et zappé le limit
Code:
$count = 0;
$queryonline = doquery("SELECT charname,onlinetime FROM {{table}} ORDER BY regdate,charname", "users");
while ($onlinerow = mysql_fetch_array($queryonline)) {
$username = $onlinerow['charname'];
$onlinetime = $onlinerow['onlinetime'];
$tsonline = strtotime($onlinetime);
if ($tsonline >= time()-600 && $count<5){
$count++;
$txt = 'En ligne';
}
else
$txt = 'Hors ligne';
$statistiques .= '<br />- ' . stripslashes($row['charname']) . ' <img src="images/login/' . $txt . '.gif" title="' . $txt . '" alt="' . $txt . '" />';
}

2006-09-24 18:51:30 est converti en timestamp avec strtotime(), et tu ne verras que les 5 derniers inscrits online.

Au cas ou j'ai encore mal compris le but, peux-tu me dire en une phrase quel est le but précis du code ? :)
 
WRInaute impliqué
Le but est d'afficher les 5 dernier inscrit. A coté des pseudo des 5 dernier inscrit je met une petite image. Si le pseudo est connecté ca affichera 'En ligne.gif' dans le cas contraire ca affichera 'Hors ligne.gif'

C'est ce que tu pense avoir fais?
 
WRInaute passionné
en tout cas ça se raproche

lol

1) une requete pour extraire les 5 derniers inscrits

$query = ("SELECT regdate,charname,onlinetime, FROM {{table}} ORDER by regdate DESC LIMIT 5");

par contre si ton champs est formaté en " 2006-09-24 18:51:30 "

va falloir la traduire pour ensuite comparer avec onlinetime

rog
 
WRInaute discret
rog a dit:
en tout cas ça se raproche

va falloir la traduire pour ensuite comparer avec onlinetime

rog

oui oui c'est déjà dans le code :
$tsonline = strtotime($onlinetime);
if ($tsonline >= time()-600 && $count<5){


Le plus simple stf, c'est que tu testes :)
 
WRInaute passionné
t'es sur que

strtotime($onlinetime);

traduit une date Y-m-d H:i:s

en timestamp ?

il me semble que c'est bien plus complexe (j'exagère un peu)

lol

rog
 
WRInaute discret
strtotime est juste pour la conversion: tu peux tjs tester avce une valeur pour vérifier...

Sinon, il faut séparer les différentes valeurs et utiliser mktime

@++

R@f
 
WRInaute passionné
j'ai pas besoin de vérifier rafgug

je sais que ça ne fonctionne pas

donc faut parser la variable pour en extraire Y et m et d et H et i et s

raison pour laquelle j'insere toujours les date en timestamp dans ma table

rog
 
WRInaute passionné
j'ai toujours été persuadé qu'elle convertissait des dates du style

Y-M-D

mais aucun probleme, ce qui est génial avec l'informatique c'est que l'on en apprend tous les jours

rog
 
Discussions similaires
Haut