Function accepter_demande() en pdo

Résolu
Bonjour,

Je dois convertir ce code mysql en pdo :
//la function qui va verifier si le destinataire a accepté la demande
function accepter_demande()
{
$query = mysql_query("
SELECT active FROM amis WHERE (pseudo_exp = '{$_SESSION['pseudo']}' AND pseudo_dest = '{$_GET['pseudo']}')
OR
(pseudo_exp = '{$_GET['pseudo']}' AND pseudo_dest = '{$_SESSION['pseudo']}')

");
while($row = mysql_fetch_assoc($query))
{
if($row['active'] == 0)
{
return false;
}else{
return true;
}
}


J'ai tenté, j'ai fais :
//la function qui va verifier si le destinataire a accepté la demande
function accepter_demande()

{
$bdd = new PDO('mysql:host=localhost;dbname=rs;charset=utf8', 'root', '');
    //donc la, la verification:
$req = $bdd->query('SELECT COUNT(*) FROM amis WHERE pseudo_exp="'.$pseudo_exp.'" AND pseudo_dest="'.$pseudo_dest.'"');
$etat = $req->fetchColumn();
  
if($row == 0){
return false;
}else{
 return true;
  
     }
}


Pouvez-vous me corriger entièrement svp ? Merci d'avance :)

16 réponses

Résumé de la discussion

La conversion d'une fonction PHP qui vérifie l'acceptation d'une invitation d'ami de MySQL vers PDO fait l'objet d'un échange d'astuces et de corrections. Plusieurs intervenants privilégient les requêtes préparées avec des paramètres nommés, évitent les concaténations et expliquent comment récupérer un booléen via fetchColumn ou fetchAll. Les échanges insistent aussi sur la gestion des variables et des erreurs, l'utilisation d'alias dans les requêtes et l'importance de vérifier l'existence du résultat avant d'accéder à un indice. D'autres conseils insistent sur la vérification du code en conditions réelles et sur la robustesse des tests, notamment sur les scénarios sans entrée utilisateur et les éventuelles erreurs de type.

Bobot (l’IA à votre service)
  1. Modérateur

    Pouvez-vous me corriger entièrement svp ? Merci d'avance :)


    Ce coup-ci .. NON !

    Tu vas pas nous demander de te corriger tous les codes du tuto que tu es en train de faire quand même ?????

    Après ta question d'hier ... je pensais que tu essaierais de comprendre à minima ce que tu fais ... le tout .. en t'inspirant des NOMBREUX code qu'on t'a déjà corrigé ET Expliqué ...

    Et bon.. je ne veux pas dire ... mais si tu regardes bien.. c'est pratiquement la même fonction que celle que je t'ai corrigé cette nuit !

    Tu n'as qu'as t'en inspirer !

    1
    1. Modérateur
      Comme je te l'ai fait remarqué dans une précédente discussion... si tu suis un TUTO c'est pour apprendre ..... pas pour que les gens ne viennent te corriger tes codes en permanence !
      0
  2. Modérateur
    Bon aller ... je t'ai suffisamment fait réfléchir pour ce soir ...

    //la function qui va verifier si le destinataire a accepté la demande
    function accepter_demande(){
      global $bdd;
    
      //récupération des variables PROPREMENT !
      $pseudo_exp = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
      $pseudo_dest = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
    
    
      $sql = "SELECT active FROM amis 
    	        FROM amis
              WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                OR  (pseudo_ dest = :get_pseudo AND pseudo_dest = :session_pseudo)";
    
      // je place les  params dans une variable avant de l'utiliser :
      $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
      
      $query = $bdd->prepare($sql);
      $query ->execute($params);  
      $result = $query->fetchall();
    	
     //On récupère le contenu de la colonne 'active'
      $active = $result[0]['active'];
     
     // le return :
     // si active == 0 on retourne false .. sinon true :
     return $active == 0 ? false : true ;
    }
    
    

    1
    1. Modérateur
      c'est un pb de copier/coller

      remplace le code :
      // je place les  params dans une variable avant de l'utiliser :
        $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;


      // je place les  params dans une variable avant de l'utiliser :
        $params = array('get_pseudo' => $pseudo_exp , 'session_pseudo' => $pseudo_dest) ;
      1
      1. Modérateur
        Ainsi que le code :
          $active = $result[0]['active'];
        


        par
        
          $active = isset($result) ? $result[0]['active'] : 0;
        
        
        0
    2. J'ai tenté de faire le code, je l'ai posté dites moi ce qui ne va pas svp
      0
      1. Modérateur
        ok.. ce qui ne va pas donc :

        - Pourquoi remets tu la connexion à ta BDD dans ta fonction ...... alors que tu disposes déjà d'une variable qui la contient ??

        - Dans ton code... d'où provient la variable $row ?

        - Où sont initialisées tes variables $pseudo_exp et $pseudo_sess ?

        - Pourquoi ta requête n'est pas la même que celle de la fonction que tu essayes de traduire en pdo ??

        Voila... si tu arrives à répondre à ces questions.. je penses que tu réussira à corriger ton code par toi même
        0
      2. Modérateur
        Si, malgré ces corrections, ça bloque toujours... reviens nous poster le code modifié qu'on te dise ce qui ne va pas.
        0
    3. global $bdd; // déclaration globale de BDD
      
        //récupération des variables PROPREMENT !
        $pseudo_exp = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
        $pseudo_dest = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
      
        // je mets la requête dans une variable AVANT de l'utiliser
        // PS :  j'ai ajouté un ALIAS  (COUNT(id_invitation) as NB) afin de pouvoir plus facilement
        // utiliser le résultat de la requête...
        $sql = "SELECT COUNT(id_invitation) as NB
      	        FROM amis
                WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                  OR  (pseudo_ dest = :get_pseudo AND pseudo_dest = :session_pseudo)";
      
        // je place les  params dans une variable avant de l'utiliser :
        $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
        
        $query = $bdd->prepare($sql);
        $query ->execute($params);  
        $result = $query->fetchall();
      	
        //on récupère le NB de ta requête...
         $nb = $result[0]['NB'];
        //On fait un RETURN pour envoyer le résultat vers ton code...
        return $nb;
      }


      ce serait bon comme ceci ?
      0
      1. Modérateur
        C'est beaucoup mieux..

        Par contre... là ... tu n'as fais qu'un copié/collé de ton autre fonction.....

        La requête à utiliser n'est pas la même normalement (regardes le code en mysql_ que tu as posté au début
        0
    4. //la function qui va verifier si le destinataire a accepté la demande
      function accepter_demande()
      global $bdd; // déclaration globale de BDD
      
        $req = $bdd->prepare('SELECT COUNT(*) FROM amis WHERE pseudo_exp=:pseudo_exp AND pseudo_dest=:pseudo_dest');
          $req->execute(array(':pseudo_exp'=>$pseudo_exp, 'pseudo_dest'=>$pseudo_dest));
          $check = $req->fetchColumn();
           
          if($check > 0){
              // Il y a des valeurs. soit return true;
          }
          else{
              // Pas de valeur. soit return false;
          }
      }


      Celui ci est bon ?
      0
      1. Modérateur
        NON
        0
    5. Modérateur
      ....

      reprenons dans l'ordre ....

      Déjà ... quelle est la requête sql que tu dois réaliser ?
      0
      1. Modérateur
        Tu sais ce qu'est une requête sql au moins ??
        0
    6. Ouii c'est une instruction qui va permettre d'interroger ma bdd
      0
      1. Modérateur
        Et donc... pour ta fonction accepter_demande .. laquelle dois tu utiliser ?

        PS: "qui va permettre d'interroger ma bdd" ... pas seulement... une requête peut permettre d'interroger une BDD ( requête SELECT ) .. de mettre à jour des champs dans une table ( requête UPDATE ) .. d'insérer des nouvelles données dans une table ( requête INSERT )...
        0
    7. Requete SELECT
      0
      1. Modérateur
        ... oui .. requête de type SELECT ... ok .... mais et donc ... ?
        Quelle est la requête dans son INTEGRALITE que tu dois utiliser ??
        0
    8. Je ne sais pas
      0
      1. Modérateur
        .......... tu me dis savoir ce qu'est une requête SQL ....et tu n'es pas en mesure de me dire laquelle tu dois utiliser ?

        Pour t'aider : indique nous, la requête utilisée dans le code que tu posté dans ta question.... (le code que tu veux convertir en PDO ) ...
        Autrement dit ... que contient la variable $sql ??
        0
      2. Un SÉLECT active de 2 variables pseudo
        0
      3. Modérateur
        @Zakarya93oui c'est bien ça .... mais pourrais tu coller le CODE DE LA REQUETE SQL que tu dois utiliser ?

         $sql ="  ................ ";
        

        ==>> Remplace les ....... par la requête à utiliser.

        Là .. maintenant.. je ne sais comment je pourrais t'expliquer mieux que ça .... :-/
        0
    9. $sql ="  SELECT active FROM amis WHERE (pseudo_exp = '{$_SESSION['pseudo']}' AND pseudo_dest = '{$_GET['pseudo']}') ";
      0
      1. Modérateur
        c'est bien celle là ...
        Sauf qu'en l'état ... les variables ne sont pas bien passées ....
        Il faut que tu utilises la syntaxe de la pdo...
        Comme dans le code :
          $sql = "SELECT COUNT(id_invitation) as NB
        	        FROM amis
                  WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                    OR  (pseudo_ dest = :get_pseudo AND pseudo_dest = :session_pseudo)";
        
          // je place les  params dans une variable avant de l'utiliser :
          $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
          
          $query = $bdd->prepare($sql);
          $query ->execute($params);  
          $result = $query->fetchall();
        
        0
    10. Merci vous êtes trop sympathique ^^
      sinon j'ai 3 erreurs :

      Notice: Undefined variable: pseudoGet in C:\wamp\www\rs\functions\profile.func.php on line 63

      Notice: Undefined variable: pseudoSession in C:\wamp\www\rs\functions\profile.func.php on line 63

      Notice: Undefined offset: 0 in C:\wamp\www\rs\functions\profile.func.php on line 70

      <?php
      //-----------------------------
      //Profile.func.php 
      //-----------------------------
      // la fonction qui va recuperer les informations de la personne choisie par l'utilisateur
      function recuperer_info_membre_choisi($pseudo = NULL) {
      global $bdd; // déclaration globale de BDD
      
      $result = array();
      
      $sql = "SELECT * FROM utilisateurs WHERE pseudo=:pseudo" ;
      $query = $bdd->prepare($sql);
      $query->execute(array(':pseudo' =>$pseudo));
      $result=$query->fetchall();
      
      return $result;
      }
      
      //la function qui va vérifier si une demande existe entre les deux membres
      function demande_existe() {
       global $bdd; // déclaration globale de BDD
      
        //récupération des variables PROPREMENT !
        $pseudoSession = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
        $pseudoGet = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
      
        // je mets la requête dans une variable AVANT de l'utiliser
        // PS :  j'ai ajouté un ALIAS  (COUNT(id_invitation) as NB) afin de pouvoir plus facilement
        // utiliser le résultat de la requête...
        $sql = "SELECT COUNT(id_invitation) as NB
      	        FROM amis
                WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                  OR  (pseudo_exp = :get_pseudo AND pseudo_dest = :session_pseudo)";
      
        // je place les  params dans une variable avant de l'utiliser :
        $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
        
        $query = $bdd->prepare($sql);
        $query ->execute($params);  
        $result = $query->fetchall();
      	
        //on récupère le NB de ta requête...
         $nb = $result[0]['NB'];
        //On fait un RETURN pour envoyer le résultat vers ton code...
        return $nb;
      }
      
      //la function qui va verifier si le destinataire a accepté la demande
      function accepter_demande(){
        global $bdd;
      
        //récupération des variables PROPREMENT !
        $pseudo_exp = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
        $pseudo_dest = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
      
      
        $sql = "SELECT active FROM amis 
      	        FROM amis
                WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                  OR  (pseudo_ dest = :get_pseudo AND pseudo_dest = :session_pseudo)";
      
        // je place les  params dans une variable avant de l'utiliser :
        $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
        
        $query = $bdd->prepare($sql);
        $query ->execute($params);  
        $result = $query->fetchall();
      	
       //On récupère le contenu de la colonne 'active'
        $active = $result[0]['active'];
       
       // le return :
       // si active == 0 on retourne false .. sinon true :
       return $active == 0 ? false : true ;
      }
      0
      1. J'ai toujours ce : Notice: Undefined offset: 0 in C:\wamp\www\rs\functions\profile.func.php on line 70

        malgré la modif ligne 70
        0
        1. Modérateur
          Tu as fais les deux corrections que je t'ai donné ???
          reposte ton code modifié
          0
        2. Modérateur
          Essaye ça :
           //On récupère le contenu de la colonne 'active'
            $active = isset($result) && count($result)>0 ? $result[0]['active'] : 0;
          
          
          0
      2. <?php
        //-----------------------------
        //Profile.func.php 
        //-----------------------------
        // la fonction qui va recuperer les informations de la personne choisie par l'utilisateur
        function recuperer_info_membre_choisi($pseudo = NULL) {
        global $bdd; // déclaration globale de BDD
        
        $result = array();
        
        $sql = "SELECT * FROM utilisateurs WHERE pseudo=:pseudo" ;
        $query = $bdd->prepare($sql);
        $query->execute(array(':pseudo' =>$pseudo));
        $result=$query->fetchall();
        
        return $result;
        }
        
        //la function qui va vérifier si une demande existe entre les deux membres
        function demande_existe() {
         global $bdd; // déclaration globale de BDD
        
          //récupération des variables PROPREMENT !
          $pseudoSession = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
          $pseudoGet = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
        
          // je mets la requête dans une variable AVANT de l'utiliser
          // PS :  j'ai ajouté un ALIAS  (COUNT(id_invitation) as NB) afin de pouvoir plus facilement
          // utiliser le résultat de la requête...
          $sql = "SELECT COUNT(id_invitation) as NB
        	        FROM amis
                  WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                    OR  (pseudo_exp = :get_pseudo AND pseudo_dest = :session_pseudo)";
        
          // je place les  params dans une variable avant de l'utiliser :
          $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
          
          $query = $bdd->prepare($sql);
          $query ->execute($params);  
          $result = $query->fetchall();
        	
          //on récupère le NB de ta requête...
           $nb = $result[0]['NB'];
          //On fait un RETURN pour envoyer le résultat vers ton code...
          return $nb;
        }
        
        //la function qui va verifier si le destinataire a accepté la demande
        function accepter_demande(){
          global $bdd;
        
          //récupération des variables PROPREMENT !
          $pseudo_exp = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
          $pseudo_dest = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
        
        
          $sql = "SELECT active FROM amis 
        	        FROM amis
                  WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                    OR  (pseudo_ dest = :get_pseudo AND pseudo_dest = :session_pseudo)";
        
          // je place les  params dans une variable avant de l'utiliser :
          $params = array('get_pseudo' => $pseudo_exp , 'session_pseudo' => $pseudo_dest) ;
          
          $query = $bdd->prepare($sql);
          $query ->execute($params);  
          $result = $query->fetchall();
        	
         //On récupère le contenu de la colonne 'active'
          $active = isset($result) ? $result[0]['active'] : 0;
         
         // le return :
         // si active == 0 on retourne false .. sinon true :
         return $active == 0 ? false : true ;
        }
        0
      3. 1 millions de merci; mon site est bientot terminé :)
        0
        1. Modérateur
          Chouette :-)
          0