Système de membre connectés

Résolu/Fermé
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 - 16 janv. 2010 à 20:06
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 - 17 janv. 2010 à 19:44
Bonjour, je suis en train de développer un système qui permet d'afficher les pseudo des membres connectés par rapport a leur IP. J'explique.
J'ai une table, connectes, qui contient l'ip des connectés (visiteurs et membres confondus) ca me permet de faire un système "Il y a X Connectés". Au bout de 5 minutes, l'entrée s'efface.
Quand un membre se connecte via les champs de connexion, son IP est automatiquement inscrite dans une autre table appelée comptes.
Ce que je voudrais faire c'est voir si l'IP de tel ou tel membre est inscrit dans la table connectes, donc comparer la table connectes et la table comptes, puis associer le pseudo qui correspond a l'IP pour pouvoir l'afficher en tant que membre connecté.
J'ai fait ce code :
					$ip_test_brut = mysql_query('SELECT IP FROM comptes') or die(mysql_error());
					$ip_test_brut_2 = mysql_query('SELECT ip FROM connectes') or die(mysql_error());
					$array = array (''.$ip_test_brut.' => '.$ip_test_brut_2.'') or die(mysql_error());
					$pseudo_test_brut = mysql_query('SELECT * FROM comptes WHERE IP = '.$array.'') or die(mysql_error());
					while ($donnees = mysql_fetch_array($pseudo_test_brut))
					{
						echo ''.$donnees['pseudo'].'';
					}

Mais ca ne marche pas, il me met l'erreur : Unknow column array
Cette erreur je m'en doutais un peu ^^
Pouvez-vous m'aider s'il vous plait ?
Merci

14 réponses

avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 janv. 2010 à 20:30
$array = array (''.$ip_test_brut.' => '.$ip_test_brut_2.'') or die(mysql_error());
Essaye en retirant l'espace entre "array" et "(".

Pour ton système, je te conseil d'ajouter 2 champs sur ta table des membres au lieu d'en créer une.
Ces deux champs seraient :
1/ derniere_visite (INT) : contient le timestamp du dernier chargement d'une page (mis à jour à chaque chargement de page, à l'aide d'un script inclus dans cahque page).
2/ derniere_ip (INT ou TINYTEXT) : pareil, mais cette fois ci le champ contient la dernière IP utilisée.
Tu peux directement enregistrer l'IP (TINYTEXT), mais je te conseil d'utiliser ip2long() et long2ip() pour stocker les adresses IP en INT plutôt qu'en STRING.
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
16 janv. 2010 à 20:35
j'ai l'espace comme tu m'a dit, mais ca ne marche toujours pas.
Mais à quoi servirait l'enregistrement de la dernière visite ou de la dernière ip, puisque ce qui m'interesse, c'est d'associer l'ip connecté au pseudo du membre.
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 janv. 2010 à 20:54
C'est juste une autre façon de faire, celle que j'utiliserais.
Et l'IP est forcément liée au compte car c'est sur la même entrée.
Dans ta table pourraie ressembler à ça :
id | pseudo | pass_md5 | presentation | derniere_connexion | derniere_ip
Pour savoir si le membre est connecté, il suffit que "derniere_connexion" soit inférieur (ou égal) au timestamp actuel moins 300 (300 secondes = 5 minutes).

$pdo = new PDO('mysql:host=localhost;dbname=basededonnees', 'user', 'password');
$sql = 'SELECT pseudo, derniere_ip FROM membres WHERE derniere_connexion <= '.(time() - 300);
$req = $pdo->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
while($membre = $req->fetch()) {
    echo $membre->pseudo.' est connecté avec l\'IP '.$membre->derniere_ip.'<br/>'."\n";
}
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
16 janv. 2010 à 22:30
ok merci :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 janv. 2010 à 23:39
Résolu ?
Pour afficher "Il y a x connectés", voilà le script :
$pdo = new PDO('mysql:host=localhost;dbname=basededonnees', 'user', 'password');
$sql = 'SELECT * FROM membres WHERE derniere_connexion <= '.(time() - 300);
$nbConnectes = $pdo->exec($sql);
echo 'Il y a '.$nbConnectes.' connectés';
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
17 janv. 2010 à 11:57
Ba j'ai réussi a faire le truc moi-même, voici le code :
					if ($donnees['nbre_entrees'] != 0)
					{
						$ip_test_brut = mysql_query('SELECT ip FROM connectes') or die(mysql_error());
						$array_ip = mysql_fetch_array($ip_test_brut)or die(mysql_error());
						$pseudo_ip_brut = mysql_query('SELECT IP, pseudo FROM comptes') or die(mysql_error());	
						$pseudo_ip = mysql_fetch_array($pseudo_ip_brut)or die(mysql_error());
						$ip_pseudo = $pseudo_ip['IP'];
						if ($array_ip['ip'] = $ip_pseudo) 
						{
						
						echo '<li>'.$pseudo_ip['pseudo'].'</li>';
						}
					}


Mais là logiquement, ca n'afficherait qu'un pseudo, et si je fait un while, la boucle tournerai toujours sur le même pseudo. Comment pourrais-je faire ?
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
17 janv. 2010 à 12:26
Pense à désindenter tes codes avant de les copiers.
Et tu n'as toujours pas fait comme je t'ai dit, avec les champs "derniere_visite" et "derniere_ip" !
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
17 janv. 2010 à 12:46
Non, je n'ai pas fait ce système, je n'ai pas essayé, j'ai donc fait celui là qui marche, et je voudrais savoir s'il y a une solution a mon problème ^^
S'il vous plait.
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
17 janv. 2010 à 14:49
Base toi sur mon script, c'est le même principe, sauf qu'il faut changer la table, le nom des champs et retirer la clause WHERE.
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
17 janv. 2010 à 17:16
Voilà, j'ai fait ce système, qui est bon puisqu'il m'a afficher le pseudo d'un membre connecté, mais il ne me l'a affiché que quelques minutes, je me suis reconnecté et là, il ne veut plus rien m'afficher.
Voici le code :
$time = 300;
$connectes_brut = mysql_query('SELECT * FROM comptes WHERE timestamp <= \''.(time() - $time).'\'')or die (mysql_error());
while ($donnees = mysql_fetch_array($connectes_brut))
{
echo '<li><a href="envoyer_message.php?repondre='.$donnees['pseudo'].'&amp;titre=Connecté">'.$donnees['pseudo'].'</a></li>';
}


Et voici le code d'update de l'ip et du timestamp (qui est intégré a toutes les pages) :
mysql_query("UPDATE comptes SET IP='".$_SERVER['REMOTE_ADDR']."', timestamp='".time()."' WHERE pseudo='".$verif_pseudo."'")or die (mysql_error());


Qu'est-ce qui cloche ?
Merci

EDIT : Je viens de remarquer qu'il met le pseudo dans la liste des connectés un peu de temps après, est-ce parce que je suis en local ?
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
17 janv. 2010 à 17:26
Si ton champ timestamp est en INT alors ne mets pas d'apostrophes autour du nombre, sinon ça devient une chaine de caractères.
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
17 janv. 2010 à 17:35
ca ferait
mysql_query("UPDATE comptes SET IP='".$_SERVER['REMOTE_ADDR']."', timestamp=".time()." WHERE pseudo='".$verif_pseudo."'")or die (mysql_error());

c'est bien ca ?
0
aneantisseur Messages postés 384 Date d'inscription dimanche 8 mars 2009 Statut Membre Dernière intervention 13 juillet 2018 18
17 janv. 2010 à 17:47
Je crois avoir trouvé, j'avais mis
WHERE timestamp <= \''.(time() - $time).'\'')

j'ai changé et j'ai mis
>=
au lieu de
<=

Et tout marche parfaitement maintenant.
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
17 janv. 2010 à 19:44
Effectivement, je me suis trompé de signe.
Je mets le topic en résolu.
0