Problème pour transformer un code en pdo

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour, je n'arrive pas à modifier correctement ce bout de code pour qu'il soit en pdo :
<?php
mysql_connect('127.0.0.1', 'root', '');
mysql_select_db('aide-systeme');
if(isset($_SESSION['pseudo']))
{
        $dnns = mysql_fetch_array(mysql_query('select count(pseudo) as nb from cpt_connectes where pseudo="'.$_SESSION['pseudo'].'"'));
        if($dnns['nb']>0)
        {
                mysql_query('update cpt_connectes set timestamp="'.time().'" where pseudo="'.$_SESSION['pseudo'].'"');
        }
        else
        {
                mysql_query('insert into cpt_connectes (pseudo, timestamp) values ("'.$_SESSION['pseudo'].'", "'.time().'")');
        }
}
$times_m_5mins = time()-(60*5);
mysql_query('detete from cpt_connectes where timestamp<"'.$times_m_5mins.'"');
$dnns2 = mysql_query('select pseudo as nb from cpt_connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connecté(s)';
if($dnns['nb']>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
?>


Merci d'avance
Nils0

2 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Déjà.. prend l'habitude de placer le code de connexion à la BDD dans un fichier à part.
    Cela t'évitera de devoir retaper le code dans les différentes pages de ton site.

    En PDO le fichier ressemble à ça:
    <?php
    //fichier de connexion à la bdd : cnxbdd.php
    try{
    $bdd =new PDO('mysql:host=localhost;dbname=aide-systeme; charset=utf8', 'root', '');
     $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
        // en cas d'erreur lors de la connexion à la bdd
        die('Erreur : ' . $e->getMessage());
    }
    

    Pense aussi à récupérer PROPREMENT tes varialbes ( POST / GET / SESSION.... ) en utilisant l'écriture Ternaire.
    Voir ici :
    https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index

    Il faut également, en PDO, utiliser des blocs TRY/CATCH pour detecter les éventuelles erreurs dans les requêtes.

    Une fois tout cela pris en compte... voici à quoi ressemble désormais ton code :
    <?php
    //Affichage des erreurs PHP
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //connexion à la BDD
    require_once 'cnxbdd.php';
    
    //récupération PROPRE des variables
    $pseudo = !empty($_SESSION['pseudo']) ? $_SESSION['pseudo'] : NULL;
    
    //début du traitement :
    if($pseudo){
      $sql = "SELECT COUNT(pseudo) as nb 
              FROM cpt_connectes 
        WHERE pseudo=:pseudo";
        
       $datas = array(':pseudo'=>$pseudo);
       try{
         $requete = $bdd -> prepare($sql) ;
         $requete->execute($datas) ;  
       } catch(PDOException $e) {
        // en cas d'erreur dans la requete
         echo 'Erreur : ' . $e->getMessage();
       }
      $res = $requete->fetchAll(); 
      if(!empty($res)){
        if($res[0]['nb']>0){
        $sql = "update cpt_connectes set timestamp="'.time().'" where pseudo=:pseudo";  
     } else {
         $sql = "insert into cpt_connectes (pseudo, timestamp) values (:pseudo";,'".time()."');
     }
    $datas = array(':pseudo'=>$pseudo);
     try{
          $requete = $bdd -> prepare($sql) ;
          $requete->execute($datas) ;
        } catch(PDOException $e) {
        // en cas d'erreur dans la requete
         echo 'Erreur : ' . $e->getMessage();
        }
      }
     
    }
    
    $times_m_5mins = time()-(60*5);
    $sql = 'detete from cpt_connectes where timestamp<"'.$times_m_5mins.'"';
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute() ;
    } catch(PDOException $e) {
    // en cas d'erreur dans la requete
     echo 'Erreur : ' . $e->getMessage();
    }
    
    $sql = "SELECT pseudo FROM cpt_connectes ";
    try{
     $requete = $bdd -> prepare($sql) ;
     $requete->execute() ;
    } catch(PDOException $e) {
    // en cas d'erreur dans la requete
     echo 'Erreur : ' . $e->getMessage();
    }
    
    $res = $requete->fetchAll();
    $nbConnecte = !empty($res) ? count($res) : 0;
    echo 'Il y a actuellement <strong>'.$nbConnecte.'</strong> membre(s) connecté(s)';
    
    if($nbConnecte > 0 ){
      $arr_pseudo = join(",",$res);
      echo $arr_pseudo;
    }
    ?>
    


    Cordialement, 
    Jordane                                                                 
    1
    1. Utilisateur anonyme
       
      Ok, merci beacoup !
      Il y a une erreur dans de ce bloc de code :
      if($nbConnecte > 0 ){
        $arr_pseudo = join("<br />",$res);
        echo $arr_pseudo;
      }
      

      L'erreur :
      Notice: Array to string conversion in ... on line 107
      Merci
      Nils0
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Utilisateur anonyme
         
        Change ce pavé par :
        if($nbConnecte > 0 ){
          foreach($res as $P){
            echo $P['pseudo'] . "<br>";
          }
        }
        
        
        0
    2. Utilisateur anonyme
       
      Merci beaucoup, ça marche :)
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Utilisateur anonyme
         
        pense à mettre le sujet en RESOLU (lien sous le titre de ta question)
        0
    3. Utilisateur anonyme
       
      c'est bon
      0
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Histoire d'alléger un peu le code (et éviter des TRY/CATCH partout...) voici ton code refait en utilisant une FONCTION pour l'éxécution des requêtes
    <?php
    //-------------------------------------------------------------------//
    //Affichage des erreurs PHP
    //-------------------------------------------------------------------//
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //-------------------------------------------------------------------//
    //connexion à la BDD
    //-------------------------------------------------------------------//
    require_once 'cnxbdd.php';
    
    //-------------------------------------------------------------------//
    //-------- FONCTION DE REQUETE -----------//
    //-------------------------------------------------------------------//
    function pdoQuery($sql,$datas=NULL){
      glob $bdd; //instance de connexion à la BDD
      if(!empty($sql) && !empty($bdd)){
       try{
         $requete = $bdd -> prepare($sql) ;
         $requete->execute($datas) ;  
       } catch(PDOException $e) {
        // en cas d'erreur dans la requete
         echo 'Erreur : ' . $e->getMessage();
         $requete = NULL;
       }
      }else  {
       //pas de requete ou de connexion à la bdd
       $requete = NULL;
      }
      return $requete;
    }
    
    //-------------------------------------------------------------------//
    //récupération PROPRE des variables
    //-------------------------------------------------------------------//
    $pseudo = !empty($_SESSION['pseudo']) ? $_SESSION['pseudo'] : NULL;
    
    //-------------------------------------------------------------------//
    //début du traitement :
    //-------------------------------------------------------------------//
    if($pseudo){
      $sql = "SELECT COUNT(pseudo) as nb 
              FROM cpt_connectes 
              WHERE pseudo=:pseudo";
        
       $datas = array(':pseudo'=>$pseudo);
      
      $requete = pdoQuery($sql,$datas); 
      $res = !empty($requete) ? $requete->fetchAll() : NULL;
       
       if(!empty($res)){
         if($res[0]['nb']>0){
           $sql = "update cpt_connectes set timestamp="'.time().'" where pseudo=:pseudo";  
         } else {
           $sql = "insert into cpt_connectes (pseudo, timestamp) values (:pseudo";,'".time()."');
         }
         $datas = array(':pseudo'=>$pseudo);
         $requete = pdoQuery($sql,$datas); 
       }
    }
    
    $times_m_5mins = time()-(60*5);
    $sql = 'detete from cpt_connectes where timestamp<"'.$times_m_5mins.'"';
    $requete = pdoQuery($sql); 
    
    $sql = "SELECT pseudo FROM cpt_connectes ";
    $requete = pdoQuery($sql); 
    $res = !empty($requete) ? $requete->fetchAll() : NULL;
    
    $nbConnecte = !empty($res) ? count($res) : 0;
    echo 'Il y a actuellement <strong>'.$nbConnecte.'</strong> membre(s) connecté(s)';
    
    if($nbConnecte > 0 ){
      foreach($res as $P){
        echo $P['pseudo'] . "<br>";
      }
    }
    ?>
    
    0
    1. Utilisateur anonyme
       
      Super merci beaucoup
      0
    2. Utilisateur anonyme
       
      Rebonjour, j'aimerais juste savoir ce que vous en pensez :
      function deco_auto(){ 
      	if(isset($_SESSION['id'])){
      		if(!isset($bdd)){
      			$bdd = connexion_bdd();
      		}
      		$pseudo = !empty($_SESSION['pseudo']) ? $_SESSION['pseudo'] : NULL;
      		$get_id = htmlspecialchars($_SESSION['id']);
      		$times_limit = time()-(60*10);
      		$requete2 = $bdd->prepare("SELECT * FROM cpt_connectes") ;
      		$requete2->execute();
      		$res = $requete2->fetch();
      			if(!empty($res['timestamp']) AND $res['timestamp'] < $times_limit){ // deconnexion auto
      				$requete = $bdd->prepare("DELETE FROM cpt_connectes WHERE timestamp < ".$times_limit."") ;
      				$requete->execute();
      				$reqco = $bdd->prepare('UPDATE membres SET co = 0 WHERE id = ?');
      				$reqco->execute(array($get_id));
      				$reqdco = $bdd->prepare('UPDATE membres SET derniere_co = NOW() WHERE id = ?');
      				$reqdco->execute(array($get_id));
      				$_SESSION = array();
      				session_destroy();
      				header('Location: connexion.php');
      			} else { // réactualiation du temps
        				$requete = $bdd->prepare("SELECT COUNT(pseudo) AS nb FROM cpt_connectes WHERE pseudo=?");
        				$requete->execute(array($pseudo));  
        				$res = $requete->fetchAll(); 
          				if(!empty($res)){
            					if($res[0]['nb']>0){
              					$sql = "UPDATE cpt_connectes SET timestamp=".time()." WHERE pseudo=?";  
            					} else {
              					$sql = "INSERT INTO cpt_connectes (pseudo, timestamp) VALUES (?,".time().")";      				
            					}
            					$requete = $bdd->prepare($sql);
            					$requete->execute(array($pseudo));
            					$reqco = $bdd->prepare('UPDATE membres SET co = 1 WHERE id = ?');
                  			$reqco->execute(array($get_id));
      
          				}
      			}
      	}
      }
      


      C'est pour une déconnexion automatique
      Merci
      Nils0
      Bonne année et bonne santé
      0
    3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Utilisateur anonyme
       
      Moi je découperai en plusieurs sous fonctions ...

      Un truc du style :
      <?php
      
      //démarrage des sessions si pas déjà démarrées
      if(session_id() == '') {
          session_start();
      }
      
      //-----------------------------------------------------------//
      //  **********   FONCTIONS ************
      //-----------------------------------------------------------//
      
      function pdoQuery($sql,$datas=NULL){
        glob $bdd; //instance de connexion à la BDD
        if(!empty($sql) && !empty($bdd)){
         try{
           $requete = $bdd -> prepare($sql) ;
           $requete->execute($datas) ;  
         } catch(PDOException $e) {
          // en cas d'erreur dans la requete
           echo 'Erreur : ' . $e->getMessage();
           $requete = NULL;
         }
        }else  {
         //pas de requete ou de connexion à la bdd
         $requete = NULL;
        }
        return $requete;
      }
      
      function delete_old_cpt(){
        $res = pdoQuery("DELETE FROM cpt_connectes WHERE timestamp < ".$times_limit."") ;
        return $res;
      }
      
      function update_co_by_id($id,$status=1){
        $res =  pdoQuery('UPDATE membres SET co = :status WHERE id = :id', array(':status'=>$status,':id'=>$get_id));
        return $res;
      }
      
      function set_derniere_co_by_id($id){
        $res = pdoQuery('UPDATE membres SET derniere_co = NOW() WHERE id = :id', array(':id'=>$get_id));
        return $res;
      }
      
      function get_Nnb_connectes($pseudo){
        $requete = pdoQuery("SELECT COUNT(pseudo) AS nb FROM cpt_connectes WHERE pseudo=:pseudo",array(':pseudo'=>$pseudo));
        $res = !empty($requete) ? $requete->fetchAll() : NULL; 
        return $res;
      }
      
      function actualise_co_user($id,$pseudo){
          $res = get_Nnb_connectes($pseudo);
          if(!empty($res)){
            if($res[0]['nb']>0){
              $sql = "UPDATE cpt_connectes SET timestamp=".time()." WHERE pseudo=?";  
            } else {
              $sql = "INSERT INTO cpt_connectes (pseudo, timestamp) VALUES (?,".time().")";          
            }
            $requete = pdoQuery($sql,array($pseudo));
            update_co_by_id($get_id,1);      
          }
        return $res;
      }
      
      function get_last_co_user_by_id($id){
        $req = pdoQuery("SELECT * FROM cpt_connectes WHERE id = :id",array(':id'=>$get_id)) ;
       $res = !empty($req) ? $req->fetch() : NULL;
        return !empty($res['timestamp']) ? $res['timestamp'] : NULL;
      }
      
      function destroyAndRedirect($urlToRedirect="index.php"){
        session_destroy();
        header('Location: '.$urlToRedirect);
        exit(); //toujours mettre un EXIT après une redirection php
      }
      
      
      /**
       * Fonction de déconnexion auto
      */
      function deco_auto(){ 
        
        //Récupération PROPRE des variables
        $get_id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
        $pseudo = !empty($_SESSION['pseudo']) ? $_SESSION['pseudo'] : NULL;
       
       //autres variables
        $bdd = !empty($bdd) ? $bdd : connexion_bdd();
        $times_limit = time()-(60*10);
       
        // on sépare les requêtes et les datas .. de leux exécution et on n'oublie pas les TRY/CATCH à moins d'utiliser la fonction que je t'avais donné !
         $timestampUser = get_last_co_user_by_id($get_id);
       
        if(!empty($timestampUser) AND $timestampUser < $times_limit){ // deconnexion auto
          delete_old_cpt();
          update_co_by_id($get_id,0);
          set_derniere_co_by_id($get_id);
          destroyAndRedirect("connexion.php");
         
        } else { // réactualiation du temps
          actualise_co_user($get_id,$pseudo);
        }
      }
      
      

      Tu places tout ça dans un fichier nommé par exemple fonctions_connexion.php
      et tu l'inclus dans tes pages via un require_once
       //fichier de fonctions
       require_once "fonctions_connexion.php";
       
       // deco auto
       deco_auto();
      
      


      bon après... y'a peut être un peu plus simple que le mécanisme que tu as voulu mettre en place ....

      par exemple,
      Stocker la valeur du dernier affichage d'une page de ton site dans une variable de session pour ne pas avoir à faire une requête pour aller chercher le dernier timestamp ...
      Un truc du genre :
      $get_id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
      $times_limit = (60*10);
      if(($_SESSION['timeout']!="") && ($_SESSION['timeout'] + $times_limit <= time())) {
        //déco
       session_destroy(); // on detruit la session en cours.
      } else {
        set_derniere_co_by_id($get_id);
        $_SESSION['timeout'] = time();
      }
      



      pour moi... je ne pense pas que ton champ "co" de ta table membres soit nécéssaire:
      Pour savoir si un utilisateur est connecté .. il suffit de regarder si son champ "timestamp" est inférieur à ton $times_limit (ce qui rend ta table cpt_connectes innutile...)
      enfin bon.. à toi de voir.
      0
    4. Utilisateur anonyme
       
      super merci beaucoup pour votre aide...
      0
    5. Utilisateur anonyme
       
      C'est sur que ça va alléger le serveur en utilisant une session au lieu de la base de donné
      0