Bonjour,

J'essaie de créer un script pour voir le nombre de personne connecté sur un site, mais le résultat reste à 0.
et là, je bloque...pourriez-vous m'apporter votre aide svp.
voici le code

<?php
// Connexion à la base de données
 try     
        {
            $bdd = new PDO('mysql:host=localhost;dbname=monsite;charset=utf8', 'root', '');
            array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
        }
         
        catch(Exception $e)
        {
                die('Erreur : '.$e->getMessage());
        }

// ÉTAPE 1 : on vérifie si l'IP se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "ip" est l'adresse IP du visiteur.

$retour = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = $retour->fetch();

if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
{
  $bdd->query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}

else // L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
{
    $bdd->query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}

// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 5 minutes. 
// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :

$timestamp_5min = time() - (60 * 5); // 60 * 5 = nombre de secondes écoulées en 5 minutes
$bdd->query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);

// ÉTAPE 3 : on compte le nombre d'IP stockées dans la table. C'est le nombre de visiteurs connectés.

$retour = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
 $donnees = $retour->fetch();

?>

<!--  mettre ceci pour afficher le nombre de connectés !

echo '<p>Il y a actuellement ' . $donnees['nbre_entrees'] . ' visiteurs sur le site !</p>'; -->


Merci.
Ta table, est elle remplie ? physiquement dans ta base
Modifié par JENCAL (13 Mar 2018 - 12:22)
Parce que du coup, peut être que

$donnees['nbre_entrees'] n'existe pas lors de ton if == 0.

Car comme la requêtes n'est pas passer, le tableau n'existe pas.

Fait plutot un isset et un or.

//Si $donnees['nbre_entrees'] existe (isset) OU (||) Si $donnees['nbre_entrees'] == 0
Modifié par JENCAL (13 Mar 2018 - 12:24)
JENCAL a écrit :
Ta table, est elle remplie ? physiquement dans ta base


Non, elle reste vide.
alors fait un
var_dump()
au dessus de

var_dump($donnees['nbre_entrees'] );
if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
{
//...
}
Il me semble que stocker des adresses ip, n'est pas autorisé par la CNIL. Attention à la réglementation ... Smiley smile
Merci JENCAL,
j'ai ça comme réponse avec le "var_dump"
C:\wamp64\www\monsite\nbr_connectes.php:11:string '0' (length=1)
Hello ricem,
Je viens de tester le script que tu présentes ici en local chez moi et il est parfaitement fonctionnel.
L'erreur vient peut-être de la structure de ta table "connectes", l'ordre des colonne est important.
Tes colonnes sont bien 'ip' puis 'timestamp' ?
Meilleure solution
Merci MatthieuR,

Oups...! Merci de cette remarque, effectivement il y avais une colonne en plus que j'avais rajouté au cas où, une colonne pseudo, ma je referais une autre table, je l'ai supprimé et ça fonctionne, enfin presque, je me suis connecté d'un autre pc en même temps et il reste à 1.
petite précision, je suis en local avec wamp, alors je sais pas si c'est normal ou pas ??

Edit: Correction, il affiche bien 2 visiteurs.
Merci encore.
Modifié par ricem (14 Mar 2018 - 08:03)