Compteur connectés

Résolu/Fermé
Talmidiel - 24 janv. 2017 à 22:59
 Talmidiel - 25 janv. 2017 à 01:21
Bonjour,

J'ai décidé d'ajouter un compteur de connectés sur mon site.
Le seul problème c'est que le seul script que j'ai est complètement buggé, j'ai plein d'erreur dans tout les sens

Voici ke script :

<?php
// Connexion à MySQL
mysql_connect("localhost", "sdz", "mot_de_passe");
mysql_select_db("coursphp");

// -------
// É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 = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
{
    mysql_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.
{
    mysql_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
mysql_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 = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_array($retour);


// Ouf ! On n'a plus qu'à afficher le nombre de connectés !
echo '<p>Il y a actuellement ' . $donnees['nbre_entrees'] . ' visiteurs connectés sur mon site !</p>';
?>


Pour info le script vient de chez open classroom

Merci d' avance pour votre aide
A voir également:

1 réponse

jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719
24 janv. 2017 à 23:25
Bonjour,

Tu dis avoir des erreurs ... lesquelles ?? (message d'erreur exact et complet ! )

Ensuite... ce script utilise l'ancienne extension mysql .. considérée comme obsolète !
Je t'invite vivement à passer à mysqli ou pdo. (perso je préfère pdo)
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

Dernier point... ce script ne peut fonctionner que si tu as également créé la table "connectes" qui va avec.
Table qui est composée de deux colonnes : "timestamp" (au format datetime ou timestamp )
et la colonne : "ip" qui est certainement un Varchar(15)


Comme je suis sympa et que j'ai un peu de temps ...
voici le même code écrit en PDO

Déjà (et quelque soit l'extension que tu prendras (pdo ou mysqli ...)) il est préférable de placer le code
de connexion à la bdd dans un fichier à part.
Ainsi tu n'auras qu'à l'inclure dans les différentes pages de ton site sans avoir à tout réécrire à chaque fois !
Donc :
<?php
//fichier de connexion à la bdd : cnxBdd.php
try{
$bdd =new PDO('mysql:host=localhost; 
 dbname=coursphp; charset=utf8', 'sdz', 'mot_de_passe');
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}


Ensuite, voici le code à proprement parlé.
<?php
// Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');

//connexion à la bdd
require_once "cnxBdd.php";


//récupération des variables
$ip = !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL;

if($ip){
// -------
// ÉTAPE 1 : on vérifie si l'IP se trouve déjà dans la table.

$sql = "SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip= :ip";
$datas = array(':ip'=>$ip);
//Execution de la requete
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($datas) ;
  $donnees = $requete->fetchAll(); //on stocke le resultat dans un array
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}

$nb_entrees = !empty($donnees[0]['nbre_entrees']) ? $donnees[0]['nbre_entrees'] : 0;

$datas2 = array(':ip'=>$ip,":time"=>time());
if ( $nb_entrees == 0) {
    // L'IP ne se trouve pas dans la table, on va l'ajouter.
    $sql = "INSERT INTO connectes VALUES(:ip,:time)";
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($$datas2) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
       print_r($datas);
    }

}else {
// L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
   $sql = "UPDATE connectes SET timestamp=:time WHERE ip=:ip";
   $datas = array(':ip'=>$ip,":time"=>time());
   try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($$datas2) ;
   }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
       print_r($datas);
   }
}

// -------
// É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
$sql = "DELETE FROM connectes WHERE timestamp < :timestamp_5min";
$datas3 = array(":timestamp_5min"=>$timestamp_5min);
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($$datas3) ;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
   print_r($datas);
}

// -------
// ÉTAPE 3 : on compte le nombre d'IP stockées dans la table. C'est le nombre de visiteurs connectés.
$sql = "SELECT COUNT(*) AS NB_CO FROM connectes";
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute() ;
  $donnees = $requete->fetchAll(); //on stocke le resultat dans un array
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}


// Ouf ! On n'a plus qu'à afficher le nombre de connectés !
$nbCo = !empty($donnees[0]['NB_CO']) ? $donnees[0]['NB_CO'] : 0;
echo "<p>Il y a actuellement $nbCo visiteurs connectés sur mon site !</p>";
?>

0
Salut,

J'ai essayé ton code, et j'ai ce message : Parse error: syntax error, unexpected end of file in /public_html/autosurf/index.php on line 185

Je ne sais pas d'où ça vient
0
jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719 > Talmidiel
24 janv. 2017 à 23:58
J'ai oublié une accolade fermante avant l'étape 2
0
Maintenant j'ai ça en plusieurs fois : Notice: Array to string conversion in /public_html/autosurf/compteur.php on line 37

Notice: Undefined variable: Array in /public_html/autosurf/compteur.php on line 37

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /public_html/autosurf/compteur.php on line 37
Il y a actuellement 0 visiteurs connectés sur mon site !
0
jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719
25 janv. 2017 à 01:07
Quelques corrections :
<?php
// Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');

//connexion à la bdd
require_once "cnxBdd.php";


//récupération des variables
$ip = !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL;

if($ip){
  // -------
  // ÉTAPE 1 : on vérifie si l'IP se trouve déjà dans la table.

  $sql = "SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip= :ip";
  $datas = array(':ip'=>$ip);
  //Execution de la requete
  try{
    $requete = $bdd -> prepare($sql) ;
    $requete->execute($datas) ;
    $donnees = $requete->fetchAll(); //on stocke le resultat dans un array
    $nb_entrees = !empty($donnees) && !empty($donnees[0]['nbre_entrees']) ? $donnees[0]['nbre_entrees'] : 0;
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
    print_r($datas);
  }

  
  $datas2 = array(':ip'=>$ip,":time"=>time());
  if ( $nb_entrees == 0) {
      // L'IP ne se trouve pas dans la table, on va l'ajouter.
      $sql = "INSERT INTO connectes VALUES(:ip,:time)";
      try{
        $requete = $bdd -> prepare($sql) ;
        $requete->execute($datas2) ;
      }catch(Exception $e){
        // en cas d'erreur :
         echo " Erreur ! ".$e->getMessage();
         echo " Les datas : " ;
         print_r($datas2);
      }

  }else {
  // L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
     $sql = "UPDATE connectes SET timestamp=:time WHERE ip=:ip";
     $datas2 = array(':ip'=>$ip,":time"=>time());
     try{
        $requete = $bdd -> prepare($sql) ;
        $requete->execute($datas2) ;
     }catch(Exception $e){
        // en cas d'erreur :
         echo " Erreur ! ".$e->getMessage();
         echo " Les datas : " ;
         print_r($datas2);
     }
  }
}
// -------
// É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
$sql3 = "DELETE FROM connectes WHERE timestamp < :timestamp_5min";
$datas3 = array(":timestamp_5min"=>$timestamp_5min);
try{
  $requete = $bdd -> prepare($sql3) ;
  $requete->execute($datas3) ;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
   print_r($datas);
}

// -------
// ÉTAPE 3 : on compte le nombre d'IP stockées dans la table. C'est le nombre de visiteurs connectés.
$sql = "SELECT COUNT(*) AS NB_CO FROM connectes";
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute() ;
  $donnees = $requete->fetchAll(); //on stocke le resultat dans un array
  $nbCo = !empty($donnees) && !empty($donnees[0]['NB_CO']) ? $donnees[0]['NB_CO'] : 0;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
}

// Ouf ! On n'a plus qu'à afficher le nombre de connectés !
echo "<p>Il y a actuellement $nbCo visiteurs connectés sur mon site !</p>";
?>
0
Talmidiel > jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024
25 janv. 2017 à 01:21
Ptn j'y comprends rien au php !!

J'ai corrigé le script, mais maintenant il n'écrit pas sur la bdd, il voit que j'ai ajouté 2 connecté, mais il ne m'ajoute pas, et il ne supprime pas les autres qui sont ka depuis 1h
0