aide fonction membre online sur tout le site

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : aide fonction membre online sur tout le site

Re: aide fonction membre online sur tout le site

par pacphil » 25 janv. 2017, 19:14

et utiliser une fonction ajax et ajouter bouton vert ou rouge je pense que je suis pas loin de la solutions

<script>
     function updateOnlineStatus(msg) {
       var status = document.getElementById("status");
       var condition = navigator.onLine ? "ONLINE" : "OFFLINE";
       status.setAttribute("class", condition);
       var state = document.getElementById("state");
       state.innerHTML = condition;
       var log = document.getElementById("log");
       log.appendChild(document.createTextNode("Évènement : " + msg + " ; état=" + condition + "\n"));
     }
     function loaded() {
       updateOnlineStatus("load");
       document.body.addEventListener("offline", function () {
         updateOnlineStatus("offline")
       }, false);
       document.body.addEventListener("online", function () {
         updateOnlineStatus("online")
       }, false);
     }
   </script>
<?PHP
session_start();
require_once("function.php");
$connection = connexion_db ();
header('Content-type: text/html; charset=UTF-8');

	 $reponse=('SELECT pseudo_site FROM online_site');
     $res = $connection->query($reponse);
     while ($result = $res->fetch()) {
		 
     setcookie('pseudo', ''.$result['pseudo_site'].'', time() + 60*60*2, null, null, false, true); // On écrit un cookie
	 }
if(isset($_COOKIE["pseudo"]) == true){
echo'<img src="imdesign/bille_verte.png" width="15" height="15">';
}else{
echo'<img src="imdesign/bille_verte.png" width="15" height="15">';	
}

?>

Re: aide fonction membre online sur tout le site

par moogli » 17 janv. 2017, 09:59

@Jc71 :
avec un subselect cela ne pose pas de problème. Un select sur la table des membre et un (select count(1) from lesconnecté where id = id) as connected et tu auras 1 ou zéro sans problème.
c'est la solution que j'ai proposé qu'il n'arrive pas a adapter à son modèle (que nous n'avons pas :/)
$requete = 'SELECT pseudo_site as pseudo ,type,(select count(1) from online_site os where os.pseudo = u.pseudo) as connected FROM online_site os ';
Pour ce qui est du volume de donnée effectivement une pagination me semble appropriée :)

@pacphil
pour avancer se serait pas mal d'avoir les create tables des tables en question.
il faut que tu comprennes ce que fait la requête pour pouvoir l'adapter a ton modèle.

@+

Re: aide fonction membre online sur tout le site

par pacphil » 16 janv. 2017, 22:23

je pensais jouer une alter on et off dans un update dans la table membres mais je ne sais pas comment faire cela

Re: aide fonction membre online sur tout le site

par Jc71 » 14 janv. 2017, 12:56

Bonjour,

Il y a un truc qui me chagrine: Ton modèle de données n'est pas approprié pour ta demande qui est (je la reformule) : afficher une pastille rouge pour chaque utilisateur non connecté, et une pastille verte pour chaque utilisateur connecté. Je m'explique:
- Outre le fait qu'il va y avoir le problème d'affichage de cette information de manière accessible et aisée dans un contexte où il peut y avoir un grand nombre d'utilisateurs (connectés ou non), tu as modélisé une table pour renseigner les utilisateurs connectés. Par conséquent ceux qui ne le sont pas sont absent de cette table. C'est bien sauf que tu es sur MySQL et que dans un tel contexte il te faudrait utiliser des instruction EXCEPT ou INTERSECT dans ta requête pour lister les utilisateurs non connectés, et MySQL ne sait pas le faire.
Maintenant si tu veux déduire les non connectés de la table membre et de la table des connectés par itération en PHP à la façon d'un CMS, je te souhaite bien du courage pour les ressources que cette fonctionnalité va te consommer et le temps qu'elle va prendre.

++

Re: aide fonction membre online sur tout le site

par Spols » 10 janv. 2017, 09:21

c'est bien ce que te dit PDO

vérifie ta structure pour faire appel au bon champ (attention aux typos). Nous on ne la connait pas .

Re: aide fonction membre online sur tout le site

par pacphil » 09 janv. 2017, 23:36

j'ai pas de champs os.pseudo juste le pseudo

Re: aide fonction membre online sur tout le site

par Spols » 08 janv. 2017, 17:41

Tu a lu le message d'erreur ??
il est en français en partie
Champ 'os.pseudo' inconnu dans where clause

Je le trouve très complet

Re: aide fonction membre online sur tout le site

par pacphil » 08 janv. 2017, 17:37

une erreur

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Champ 'os.pseudo' inconnu dans where clause' in C:\Program Files\EasyPHP-5.3.8.1\www\source\online_site.php:34 Stack trace: #0 C:\Program Files\EasyPHP-5.3.8.1\www\source\online_site.php(34): PDOStatement->execute(Array) #1 C:\Program Files\EasyPHP-5.3.8.1\www\source\header.php(99): require('C:\Program File...') #2 C:\Program Files\EasyPHP-5.3.8.1\www\source\m_profil.php(2): require('C:\Program File...') #3 {main} thrown in C:\Program Files\EasyPHP-5.3.8.1\www\source\online_site.php on line 34

Re: aide fonction membre online sur tout le site

par Spols » 07 janv. 2017, 12:20

$params = array();

Re: aide fonction membre online sur tout le site

par pacphil » 06 janv. 2017, 15:51

Bonjour il y une petite erreur $params = [];
$requete = 'SELECT pseudo_site as pseudo ,type,(select count(1) from online_site os where os.pseudo = u.pseudo) as connected FROM online_site os ';
$params = [];
if (!empty($_POST['type'])) {
    // si on a reçu un type, on filtre dessus
    $requete = $requete.' WHERE type=:type';
    // on ajoute la valeur de type aux paramètres d'exécution de la requête
    $params['type']  = $_POST['type'];
}

Re: aide fonction membre online sur tout le site

par pacphil » 06 janv. 2017, 12:12

merci moogli super sympa

Re: aide fonction membre online sur tout le site

par moogli » 06 janv. 2017, 12:01

quelque chose comme ça
<?php
if(isset($_SESSION['login_site'])){
    if(isset($_SESSION['type_site'])){
        $requete_nombre_connecte = $connection->prepare('SELECT COUNT(1) pseudo_site FROM online_site WHERE pseudo_site=:pseudo_site');
        if($requete_nombre_connecte->execute(array(':pseudo_site'=> $_SESSION['login_site']))){
            $connecte = $requete_nombre_connecte->fetchColumn();
            if($connecte > 0){
                $udapte_connecte = ('UPDATE online_site SET timestamp=:timestamp WHERE pseudo_site=:pseudo_site');
                $req_connecte = $connection->prepare($udapte_connecte);
                $req_connecte->execute(array(':timestamp'=> date("Y-m-j H:i:s"),':pseudo_site'=> $_SESSION['login_site']));
            }else{
                $connecte_online = array(
                ':timestamp'=> date("Y-m-j H:i:s"),
                ':pseudo_site'=> $_SESSION['login_site'],
                ':type'=> $_SESSION['type_site']);
                
                $values= join(', ',array_keys($connecte_online));
                $req=$connection->prepare( 'INSERT INTO online_site ('.str_replace(':','',$values).') VALUES('.$values.')' );
                $req->execute($connecte_online);
            }
        }
    }
}
$requete = 'SELECT pseudo_site as pseudo ,type,(select count(1) from online_site os where os.pseudo = u.pseudo) as connected FROM online_site os ';
$params = [];
if (!empty($_POST['type'])) {
    // si on a reçu un type, on filtre dessus
    $requete = $requete.' WHERE type=:type';
    // on ajoute la valeur de type aux paramètres d'exécution de la requête
    $params['type']  = $_POST['type'];
}
$connect = $connection->prepare($requete);
$connect->execute($params);
$imgF = 'imdesign/f.png';
$imgH = 'imdesign/h.png';
echo <<<form
<form method="post">
<input type="image" src="{$imgF}" title="Femme" width="30" height="30" border="0" name="type" value="Femme" />
<input type="image" src="{$imgH}" title="Homme" width="30" height="30" border="0" name="type" value="Homme" />
</form>
form;
$baseUrl = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
while($result = $connect->fetchObject()){
    $ballColor = 'verte';
    if ($result->connected == 1) {
        $ballColor = 'rouge';
    }
    
    $picto  = $imgF;
    $title = 'Picto Femme';
    if(strtolower($result->type) == 'homme'){
        $picto = $imgH;
        $title = 'Picto Homme';
    }
    
    echo <<<line
    <img src="imdesign/bille_{$ballColor}.png" width="15" height="15"><b>{$result->pseudo}</b>
    <img src="{$picto}" title="{$title}/>
    <a href="{$baseUrl}/envoyez_message.php?destin={$result->pseudo}"><img src="imdesign/envois.png" width="20" height="15" /></a></br>
line;
}
// pas la pein de le faire plusieurs fois ;)
$connection->exec('DELETE FROM online_site WHERE timestamp< DATE_SUB(NOW(), INTERVAL 10 MINUTE)');
il est préférable de passer un id dans l'url qu'un pseudo. En règle générale on utilise plutôt une référence qu'une donnée (même unique).

@+

Re: aide fonction membre online sur tout le site

par pacphil » 05 janv. 2017, 19:29

Pour jouer sur tout le site avec les membres online la ligne que tu à mise a la fin avec le select tu l'ajoute a quelle table stp?
<?PHP					
if(isset($_SESSION['login_site'])){
	if(isset($_SESSION['type_site'])){
			
$requete_nombre_connecte = $connection->prepare('SELECT COUNT(*) pseudo_site FROM online_site WHERE pseudo_site=:pseudo_site');
if($requete_nombre_connecte->execute(array(':pseudo_site'=> $_SESSION['login_site']))){
	$connecte = $requete_nombre_connecte->fetchColumn();
	
		if($connecte >0){
                $udapte_connecte = ('UPDATE online_site SET timestamp=:timestamp WHERE pseudo_site=:pseudo_site');	
			    $req_connecte = $connection->prepare($udapte_connecte);			
                $req_connecte->execute(array(':timestamp'=> date("Y-m-j H:i:s"),':pseudo_site'=> $_SESSION['login_site']));	
        }else{
                $connecte_online = array(
				                ':timestamp'=> date("Y-m-j H:i:s"),
				                ':pseudo_site'=> $_SESSION['login_site'],
								':type'=> $_SESSION['type_site']);	
								
                 $values= join(', ',array_keys($connecte_online));
                 $req=$connection->prepare( 'INSERT INTO online_site ('.str_replace(':','',$values).') VALUES('.$values.')' );
                 $req->execute($connecte_online);
		   }
        }
     }
  }
$requete = 'SELECT pseudo_site,type FROM online_site ';
if (!empty($_POST['type'])) {
    // si on a reçu un type, on filtre dessus
    $requete = $requete.' WHERE type=:type';
    // on ajoute la valeur de type aux paramètres d'exécution de la requête
    $params['type']  = $_POST['type'];
}
@$connect = $connection->prepare($requete);
@$connect->execute($params);		
$typef = 'Femme';
$typeh = 'Homme';	 
 echo'<FORM method="POST" action="'.$_SERVER['PHP_SELF'].'">
     <input type="image" src="imdesign/f.png" title="Femme" width="30" height="30" border="0" name="type" value="'.$typef.'" />
	 <input type="image" src="imdesign/h.png" title="Homme" width="30" height="30" border="0" name="type" value="'.$typeh.'" />
     </FORM>';
while($result = $connect->fetch()){
 $online = $result['pseudo_site'];
 $ballColor = 'verte';
  // Test du paramètre d'entrée
  if ($online == 1) {
    $ballColor = 'rouge';
  }
 	
   echo'<img src="imdesign/bille_' , $ballColor , '.png" width="15" height="15"><b>'.$result['pseudo_site'].'</b>
   <a href="http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/envoyez_message.php?destin='.$result['pseudo_site'].'"><img src="imdesign/envois.png" width="20" height="15" /></a></br>';

$connection->exec('DELETE FROM online_site WHERE timestamp< DATE_SUB(NOW(), INTERVAL 10 MINUTE)');
	  }
?>

Re: aide fonction membre online sur tout le site

par moogli » 05 janv. 2017, 17:40

qu'est ce que tu ne comprends pas la dedans ? c'est ton code sans la fonction qui sert a rien.
while($data_online = $online_sortie->fetch(PDO::FETCH_OBJ)){
 $connecte = $data_online->pseudo_site;
  // Test du paramètre d'entrée
  if ($connecte == 1){
    echo'<img src="imdesign/bille_verte.png" width="15" height="15">';
  }
 else{
   echo'<img src="imdesign/bille_rouge.png" width="15" height="15">';
  }
}
à condition que le statut connecte ou non soit bien dans $data_online->pseudo_site
une version plus concise
<?php

while($data_online = $online_sortie->fetch(PDO::FETCH_OBJ)){
 $connecte = $data_online->pseudo_site;
 $ballColor = 'rouge';
  // Test du paramètre d'entrée
  if ($connecte == 1) {
    $ballColor = 'verte';
  }
  echo'<img src="imdesign/bille_' , $ballColor , '.png" width="15" height="15">';
}
ensuite si tu veux afficher la liste de tout les membres avec une puce à coté pour savoir s'il sont en ligne il faut ajouter dans la requête de sélection des membres l'info de en ligne ou nom. Le plus simple étant une sous requête

par exemple
select user_id,pseudo, (select count(1) from online_site os where os.pseudo = u.pseudo) as connected from users u
la colonne connected contient le nombre de ligne dans la table online_site qui correspondent au pseudo de la ligne courante du coup 1 == connecté et zéro == pas connecté.


@+

Re: aide fonction membre online sur tout le site

par pacphil » 05 janv. 2017, 15:32

je vois pas bien l'idée et la façon de la mettre en place?