Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaire inscrits et non-inscrits en Mysql

Faire apparaitre les données d'un formulaire pour les inscrits ou non

    30 novembre 2021 à 15:24:34

    Bonjour,

    J'ai des erreurs dans mon code si vous pouvez me dire ce qui ne va pas

    Le problème est le suivant:

    Dans ma bdd, j'ai 5 tables liées telle que le montre la photo:

    annonces,

    catégories,

    images_annonces: là où doivent apparaitre les images

    membres: pour les connectés

    utilisateurs: pour les non-connectés

    photo:

    En remplissant le formulaire, je souhaite que l'utlisateur (non-connecté) ou le membre (connecté) lorsqu'il remplisse le formulaire les données s'affichent en bdd. Sauf que j'ai des erreurs qui apparaissent lorsque le formulaire est soumis:

     Undefined index: motdepasse in

    Notice: Undefined variable: id_categorie in

    Undefined variable: created_by in  etc...

    Integrity constraint violation: 1048 Le champ 'id_categorie' ne peut �tre vide (null)

     Voici le formulaire:

    <div class= "pub">      
        <form action="" method="POST" enctype="multipart/form-data">
    
        <fieldset>
             
                    <p>Déposer votre annonce</p>
    
    
                                    //Si l'utilisateur est connecté
                    <?php if(isset($_SESSION['id'])){ ?>
    
                    <label for= "pseudo"><?php echo $_SESSION['pseudo'];?></label>
                    <?php } 
                    else {?>
    
                    <label for= "pseudo">pseudo</label>
                    <input type="text" id="pseudo" name="pseudo">
                    <?php } ?>  <br> <br>
    
                    <label for="categorieannonce">Catégorie</label>
                    <select id ="categorie" name="categorie">
                        <optgroup label= "Immo">
                        <option value= "appartements">Appart</option>
                        <option value= "maisons">Maison</option>
                        <option value= "terrains">Terrain</option>
                        <option value= "locations">Location</option>
                      
                    </optgroup> <br> <br>
    
    
                    </select> <br> <br>
    
    
                    
                    <label for="ville">Ville</label>
                    <select name="ville">
                        <option value= "ville1"> Ville1</option>
                        <option value= "ville2"> Ville2</option>
                        <option value= "ville3">Ville3</option>
                   
                        
    </select>
    
                 <br> <br>
    
    
                    <label for= "titre">titre</label>
                    <input type="text" id="titre" name="titre">  <br> <br>
    
                    <label for= "presentation">Description</label>
                    <textarea id="presentation" name="description" rows="4" cols="50"> </textarea> <br> <br> <br> <br>
    
                    <label for= "prix">Prix</label>
                    <input type="number" id="prix" name="prix">  <br> <br>
                    
                    <label for="phone">Telephone</label>
                    <input type="tel" id="phone" name="telephone"> <br> <br>
    
                    <label for= "mail">Email </label>
                    <input type="email" id="mail" name="email" /> <br> <br>
    
    
                    <label for= "image">Photo1</label>
                    <input type="file" id="img1" name="img1" accept="image/png, image/jpeg, image/jpg" > <br><br>
                    <label for= "image">Photo2</label> 
                    <input type="file" id="img2" name="img2" accept="image/png, image/jpeg, image/jpg"><br><br>
                    <label for= "image">photo3</label>
                    <input type="file" id="img3" name="img3" accept="image/png, image/jpeg, image/jpg"> <br><br>
                    <label for= "image">photo4</label>
                    <input type="file" id="img4" name="img4" accept="image/png, image/jpeg, image/jpg"> <br><br>
                    <label for= "image">photo5</label>
                    <input type="file" id="img5" name="img5" accept="image/png, image/jpeg, image/jpg"> <br><br>
                    <br> <br>
    
    
                    <input type="submit" id='submit' name="formannonce" value='<?php echo $lang['valider'];?>' >
                 
                </form>
    </fieldset>
            </div>


    et le problème est au niveau de mon code. Je ne sais pas ce qui cloche. Voici le code:

    <?php
    //----------------------------------------------------------//
    // FONCTIONS
    // On place les fonctions au debut du script ...
    //----------------------------------------------------------//
    function savePhoto($id_annonce,$id_categorie,$id_membre,$created_by,$file,$location){
    
        if(empty($file)){
          echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
          var_dump($_FILES); // juste pour le debug...
          return false; //pas d'image
        }
        $photo = $file['name'];
        $photo_tmp = $file['tmp_name'];
        if(move_uploaded_file($photo_tmp,$location.$photo)){
           return insertPhoto($id_annonce,$id_categorie,$id_membre,$created_by,$location.$photo); // tu peux retirer le location si tu ne veux que le nom de l'image et pas son chemin complet
        }
    }
    
    
    function insertPhoto($id_annonce,$id_categorie,$id_membre,$created_by,$photo){
        global $bdd;
        $sql= "INSERT INTO images_annonces(id_annonce,filepath) VALUES(?,?)";
        $datas= array($id_annonce, $photo);
         //Execution de la requete
        try{
        //Execution pour la deuxième table
          $requete2 = $bdd -> prepare($sql) ;
          return $requete2->execute($datas) ;
        }catch(Exception $e){
            // en cas d'erreur :
            echo " Erreur ! ".$e->getMessage();
            echo " Les datas : " ; 
            print_r($datas);
        }      
    }
    
    //Requete 1
    
    function insertAnnonce( $id_categorie, $titre, $description, $prix, $villes){
      global $bdd;
     
    
      $sql= "INSERT INTO annonces(id_categorie,titre,description,prix,ville,created_by) VALUES(?,?,?,?,?,?)";
      $datas= array($id_categorie, $titre,$description, $prix, $villes,$created_by);
      //Execution de la requete
      try{ //requete pour la première tabels
        $requete = $bdd->prepare($sql) ;
        $requete->execute($datas) ;
        return $bdd->LastInsertId();
      }catch(Exception $e){
        // en cas d'erreur :
        echo " Erreur ! ".$e->getMessage();
        echo " Les datas : " ; 
        print_r($datas);
        return false;
      }
    }
    
      //Requete 2
    
      function insertCategorie( $categorie){
        global $bdd;
      $sql= "INSERT INTO categories(categorie) VALUES(?)";
      $datas= array( $categorie);
      //Execution de la requete
      try{ //requete pour la première tabels
        $requete = $bdd->prepare($sql) ;
        $requete->execute($datas) ;
        return $bdd->LastInsertId();
      }catch(Exception $e){
        // en cas d'erreur :
        echo " Erreur ! ".$e->getMessage();
        echo " Les datas : " ; 
        print_r($datas);
        return false;
      }
    
      }
      
      function insertUtilisateur($id_membre,$pseudo,$email, $telephone){
       //Requete 3
      $sql= "INSERT INTO utilisateurs(id_membre,pseudo, email, telephone) VALUES(?,?,?,?)";
      $datas= array($id_membre,$pseudo,$email, $telephone);
      //Execution de la requete
      try{ //requete pour la première tabels
        $requete = $bdd->prepare($sql) ;
        $requete->execute($datas) ;
        return $bdd->LastInsertId();
      }catch(Exception $e){
        // en cas d'erreur :
        echo " Erreur ! ".$e->getMessage();
        echo " Les datas : " ; 
        print_r($datas);
        return false;
      }
      }
    
    
    
      //Requete 4
      function insertMembre($pseudo,$email, $telephone, $motdepasse){
      $sql= "INSERT INTO membres(pseudo,email,telephone,motdepasse) VALUES(?,?,?,?)";
      $datas= array($pseudo,$email, $telephone, $motdepasse);
      //Execution de la requete
      try{ //requete pour la première tabels
        $requete = $bdd->prepare($sql) ;
        $requete->execute($datas) ;
        return $bdd->LastInsertId();
      }catch(Exception $e){
        // en cas d'erreur :
        echo " Erreur ! ".$e->getMessage();
        echo " Les datas : " ; 
        print_r($datas);
        return false;
      }
    
    
    
    
    }
    
    
    
    //----------------------------------------------------------//
    // CONSTANTES ou variables pour le paramétrage..
    //----------------------------------------------------------//
     $location= "pictures/";
    
    
     //----------------------------------------------------------//
    // Traitement du submit
    //----------------------------------------------------------//
    
    if(isset($_POST['formannonce'])) {
        $telephone= intval($_POST['telephone']); 
        $email = trim($_POST['email']); 
        $categorie= trim($_POST['categorie']);  
        $villes= trim($_POST['ville']);  
        $titre = trim($_POST['titre']);  
        $pseudo = trim($_POST['pseudo']);
        $prix= intval($_POST['prix']); 
        $description= trim($_POST['description']); 
        $motdepasse= sha1($_POST['motdepasse']); 
    
        $img1 = ($_FILES['img1']);
        $img2 = ($_FILES['img2']);
        $img3 = ($_FILES['img3']);
        $img4 = ($_FILES['img4']);
        $img5 = ($_FILES['img5']);
    
    
        //on créé l'annonce
        $id_annonce = insertAnnonce($id_categorie, $titre, $description, $prix, $villes,$created_by);
        $id_categorie= insertCategorie($categorie);
        $created_by= insertUtilisateur($id_membre,$pseudo,$email, $telephone);
        $id_membre= insertMembre($pseudo,$email, $telephone, $motdepasse);
        // si on a bien un id_product, on upload et insère les images
        if(!empty($id_annonce) AND !empty($id_categorie) AND (!empty($id_membre) ||!empty($created_by)) ){
          savePhoto($id_annonce,$id_categorie,$id_membre,$created_by,$img1,$location);
          savePhoto($id_annonce,$id_categorie,$id_membre,$created_by,$img2,$location);
          savePhoto($id_annonce,$id_categorie,$id_membre,$created_by,$img3,$location);
          savePhoto($id_annonce,$id_categorie,$id_membre,$created_by,$img4,$location);
          savePhoto($id_annonce,$id_categorie,$id_membre,$created_by,$img5,$location);
        
        echo"<h1 style= 'color: green; background-color: white; margin-top: 120px;'>Votre annonce a bien été déposée et sera publiée bientôt. 
        </h1>";
        
        }else{
          echo "Erreur : Aucun ID n'a été créé !";
        }
    }
    
     ?>


    Une belle âme pour m'éclairer :)

    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2021 à 17:25:54

      Hello, 

      Ligne 155, tu créés ta catégorie après l'annonce alors que tu l'utilise sur la ligne juste au dessus -> id_categorie est non définie ligne 154 donc tu as une erreur

      Tu n'as aucun champ mot de passe dans ton formulaire donc impossible de retrouver l'index mot de passe dans ton $_POST lorsque tu insère un membre (d'ailleurs sha1 pour un mot de passe c'est pas tip top, utilise plutôt ça : https://www.php.net/manual/fr/function.password-hash.php

      D'ailleurs je suis pas sûr de comprendre, pourquoi est-ce que tu réinsère un membre à chaque fois qu'il publie une annonce ? J'ai l'impression que tu te compliques la vie alors que tu pourrais simplement choper l'id du membre que tu as stocké en session et l'affecter à ton champ 'created_by' 

      -
      Edité par hippomssc 30 novembre 2021 à 17:30:43

      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2021 à 20:20:34

        Hello skywalskurt, merci pour ta réponse. J'ai suivi tes instructions.

        Mais tu sugéres que que j'enlève la fonction insertMembre()?

        Après pour insertUtilisateur, j'ai besoin également de $id_membre pour remplir le champ de la table utilisateur, sauf que cette variable $id_membre est difficile à définir étant liée à la table membre que je vais enlever.

        <<J'ai l'impression que tu te compliques la vie alors que tu pourrais simplement choper l'id du membre que tu as stocké en session et l'affecter à ton champ 'created_by' >>

        ==> C'est plus logique, tu as raison.

        Et après est-ce qu'il n'y a pas d'autres erreurs dans le code?

        • Partager sur Facebook
        • Partager sur Twitter
          1 décembre 2021 à 9:29:53

          Mais tu sugéres que que j'enlève la fonction insertMembre()?

          Pour la création d'annonce oui, pour moi un membre doit être insérer uniquement lorsqu'un utilisateur souhaite s'inscrire (donc plutôt à placer dans un formulaire d'inscription)

          Après pour insertUtilisateur, j'ai besoin également de $id_membre pour remplir le champ de la table utilisateur, sauf que cette variable $id_membre est difficile à définir étant liée à la table membre que je vais enlever.

          -> C'est là aussi où je ne comprends pas trop la structure de ta BD : car tu souhaites laisser la possibilité à un utilisateur non connecté (ta table utilisateur si je comprend bien) de poster une annonce, mais tu cherches quand même à rattacher un utilisateur inscrit (donc un membre) à ton utilisateur (via le champ id_membre) alors qu'il n'a jamais réellement cherché à s'inscrire...

          Si tu souhaites garder ce système, je te conseille plutôt de garder les 2 tables (utilisateur pour les users non connectés et membre pour ceux connectés) mais de les laisser indépendante l'une de l'autre. Comme ça tu vas pouvoir gérer les 2 cas, je sais pas si ça colle vraiment avec tes besoins, mas ça me semble plus logique.

          Et après est-ce qu'il n'y a pas d'autres erreurs dans le code?

          -> ça me semble ok pour le reste, tes requêtes sont bien préparées mais tu pourrais par contre ajouter un contrôle sur les fichiers qui sont uploader (vérification du mime-type, de l'extension etc etc), histoire de pas avoir de mauvaises surprises ;) (https://www.php.net/manual/fr/function.mime-content-type.php)

          -
          Edité par hippomssc 1 décembre 2021 à 10:49:58

          • Partager sur Facebook
          • Partager sur Twitter
            1 décembre 2021 à 13:15:53

            Ok compris. Tu as raison je me suis compliqué la vie.J'ai fait plus simple. J'ai tout ajouté dans une table, sauf la table annonce_images qui est à part.

            Les champs de l'annonce sont remplis lors de la soumission du formulaire, mais les images n'apparaissent pas dans la table, et je n'arrive pasà trouver le problème.

            <?php
            
            function savePhoto($id_annonce,$file,$location){
            
                if(empty($file)){
                  echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
                  var_dump($_FILES); // juste pour le debug...
                  return false; //pas d'image
                }
                $photo = $file['name'];
                $photo_tmp = $file['tmp_name'];
                if(move_uploaded_file($photo_tmp,$location.$photo)){
                   return insertPhoto($id_annonce,$location.$photo); // tu peux retirer le location si tu ne veux que le nom de l'image et pas son chemin complet
                }
            }
            
            
            function insertPhoto($id_annonce,$photo){
                global $bdd;
                $sql= "INSERT INTO images_annonces(id_annonce,filepath) VALUES(?,?)";
                $datas= array($id_annonce, $photo);
                 //Execution de la requete
                try{
                //Execution pour la deuxième table
                  $requete2 = $bdd -> prepare($sql) ;
                  return $requete2->execute($datas) ;
                }catch(Exception $e){
                    // en cas d'erreur :
                    echo " Erreur ! ".$e->getMessage();
                    echo " Les datas : " ; 
                    print_r($datas);
                }      
            }
            
            //Requete 1
            
            function insertAnnonce($pseudo,$categorie, $villes,$titre, $description, $prix, $telephone,$email){
              global $bdd;
             
            
              $sql= "INSERT INTO annonces(pseudo,categorie,ville,titre,description,prix,telephone,email) VALUES(?,?,?,?,?,?,?,?)";
              $datas= array($pseudo,$categorie, $villes,$titre, $description, $prix, $telephone,$email);
              //Execution de la requete
              try{ //requete pour la première tabels
                $requete = $bdd->prepare($sql) ;
                $requete->execute($datas) ;
                return $bdd->LastInsertId();
              }catch(Exception $e){
                // en cas d'erreur :
                echo " Erreur ! ".$e->getMessage();
                echo " Les datas : " ; 
                print_r($datas);
                return false;
              }
            }
            
            
            
            
            //----------------------------------------------------------//
            // CONSTANTES ou variables pour le paramétrage..
            //----------------------------------------------------------//
             $location= "pictures/";
            
            
             //----------------------------------------------------------//
            // Traitement du submit
            //----------------------------------------------------------//
            
            if(isset($_POST['formannonce'])) {
                $telephone= intval($_POST['telephone']);
                $email = trim($_POST['email']); 
                $categorie= trim($_POST['categorie']);  
                $villes= trim($_POST['ville']); 
                $titre = trim($_POST['titre']);  
                $pseudo = trim($_POST['pseudo']);
                $prix= intval($_POST['prix']);
                $description= trim($_POST['description']); 
            
                $img1 = ($_FILES['img1']);
                $img2 = ($_FILES['img2']);
                $img3 = ($_FILES['img3']);
                $img4 = ($_FILES['img4']);
                $img5 = ($_FILES['img5']);
            
            
                //on créé l'annonce
              
                $id_annonce = insertAnnonce($pseudo,$categorie, $villes,$titre, $description, $prix, $telephone,$email);
                // si on a bien un id_product, on upload et insère les images
                if(!empty($id_product) ){
                  savePhoto($id_annonce,$img1,$location);
                  savePhoto($id_annonce,$img2,$location); 
                  savePhoto($id_annonce,$img3,$location);
                  savePhoto($id_annonce,$img4,$location);
                  savePhoto($id_annonce,$img5,$location);
                echo"<h1 style= 'color: green; background-color: white; margin-top: 120px;'>Votre annonce a bien été déposée et sera publiée bientôt. 
                </h1>";
                
                }else{
                  echo "Erreur : Aucun ID n'a été créé !";
                }
            }
            
             ?>

            Et penses-tu, en ajoutant dans une seule table annonces: pseudo,categorie,ville,titre,description,prix,telephone,email, que je pourrai plus tard récupérer l'id des membres et savoir

            à qui appartient l'annonce? Et si veux afficher les annonces des membres lors de

            leur connexion, serait-ce possible?

            -
            Edité par mouls22 1 décembre 2021 à 17:33:14

            • Partager sur Facebook
            • Partager sur Twitter
              2 décembre 2021 à 9:27:48

              Non pas besoin de rajouter de table, ce que tu peux faire par contre c'est ajouter un id_user dans ta table annonce pour savoir quel utilisateur a créé l'annonce. Et pour savoir si c'est un membre ou un utilisateur non connecté qui a créé l'annonce tu peux également ajouter un champ booléen 'created_by_member' (ou un truc dans le genre).

              Comme ça dès que tu créé une nouvelle annonce :

              - si c'est un user non connecté, tu l'insère dans utilisateur (sauf si il n'y est pas déjà peut être? à voir avec tes besoins), puis tu affectes à id_user l'identifiant de l'utilisateur créé (ou récupérer dans le cas où il existe déjà) et tu passe false au champ 'created_by_member' 

              - si c'est un membre t'as juste à choper l'id_user stocké en session et à l'affecter à id_user et true au booléen 'created_by_member'

              Pour récupérer les annonces des membres une fois connecté, t'as juste à faire une recherche sur les annonces qui ont pour id_user l'identifiant du membre connecté et qui ont le champ 'created_by_member' à true.

              -
              Edité par hippomssc 2 décembre 2021 à 9:40:27

              • Partager sur Facebook
              • Partager sur Twitter
                2 décembre 2021 à 12:00:08

                Tes explications sont claires. Jai compris à part ça:

                <<ce que tu peux faire par contre c'est ajouter un id_user dans ta table annonce pour savoir quel utilisateur a créé l'annonce. Et pour savoir si c'est un membre ou un utilisateur non connecté qui a créé l'annonce tu peux également ajouter un champ booléen 'created_by_member' (ou un truc dans le genre).>

                Mais à quelle table sera liée id_user? parce que là j'ai 3 tables:

                1-annonces: pseudo(non-inscrit), telephone(non-inscrit), email(non-inscrit), email(non-inscrit), categorie, description..

                -> En gros dans cette table, il y a les informations des non-inscrits

                2-membres: pour les inscrits 

                3-annonces_images: contenant  les images.

                Tu suggéres que je je dois séparer les information de la table annonces, ie pseudi, email, telephone, et les mettre dans une table utilisateur(non inscrit) dont l'id sera lié à id_user de la table annonce?  Et cette table utilisateur sera indépendate de la table membre?

                • Partager sur Facebook
                • Partager sur Twitter
                  2 décembre 2021 à 14:05:36

                  My bad, j'avais pas vu que tu avais supprimé la table utilisateur.

                  Du coup si tu as juste une table membres tu peux créer un id_membre dans ta table annonces, que tu laisseras à vide dans le cas où l'annonce a été posté par un utilisateur non connecté...

                  T'auras juste à préremplir les champs pseudo tél etc de ta table annonce (ou préremplir ton formulaire, au choix) avec les infos du membre, dans le cas où c'est un utilisateur connecté. Bon ça va te faire une duplication de données (pour le pseudo etc) avec ta table membres, mais je vois pas vraiment d'autre solution.

                  Mais l'idée de base oui, c'était de faire 2 tables distinctes utilisateurs et membres, mais ton approche avec une seule table membre est peut être meilleure, moins de table à gérer et la table utilisateur n'aurait finalement pas trop d'intérêt...

                  PS : évite aussi de stocker les catégories directement dans ta table annonce, plutôt mettre un id_categorie qui fera référence à ta table catégorie, comme ça tu pourras également lister les annonces par catégories ;)

                  -
                  Edité par hippomssc 2 décembre 2021 à 17:07:29

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 décembre 2021 à 17:13:20

                    Bonjour, en voyant ton message je travaillais déjà sur ton message d'avant, ie  que j'ai séparé les informations de la table annonces. J'ai préferé garder ton idée, car c'est mieux organisée.

                    annonces est désormais: id_utilisateur, created_by_member, categorie, ville, titre, description

                    2- utilisateur: pseudo, telephone, email. --> Utilisateur est liée à annonces

                    3-annonces_images: liée à annonces

                    4-membres: pseudo, telephone, email, mot de passe --> membres n'est liée à aucune table.

                    created_by_membre est de type tinyint(1). Pour la fonction insertAnnonce ($id....) ça marche. L'erreur je pense que le problème est d'essayer de définir le boolean dans isset. Je ne sais pas comment le récupérer. Du coup, j'ai fait ainsi:

                    if(isset($_POST['formannonce'])) {
                    
                      if (isset($_SESSION['id'])) {
                        $created_by_member=1;
                        
                    } else {
                      $created_by_member=0;
                    }
                    
                        $telephone= intval($_POST['telephone']);
                        $email = trim($_POST['email']); // 
                        $categorie= trim($_POST['categorie']);  /
                        $villes= trim($_POST['ville']);  
                        $titre = trim($_POST['titre']); .
                        $pseudo = trim($_POST['pseudo']);
                        $prix= intval($_POST['prix']); 
                        $description= trim($_POST['description']); 



                    -
                    Edité par mouls22 2 décembre 2021 à 17:40:33

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 décembre 2021 à 17:26:25

                      Cool, ça me semble pas mal du tout, mais membres est lié à annonces du coup (puisque si c'est un utilisateur connecté tu insère l'id_membre dans le champ id_utilisateur ;)) 

                      Pour le booléen ça me semble niquel aussi

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 décembre 2021 à 17:46:33

                        Mais ça marche !!! Merci pour tes insctructions skywalsku :). Super Grand Merci! :) J'ai fait ça, et tout apparait dans l'ordre:

                        if(isset($_POST['formannonce'])) {
                        
                          if (isset($_SESSION['id'])) {
                            $id_utilisateur=$_SESSION['id'];
                            $created_by_member=1;
                            $pseudo=$_SESSION['pseudo'];
                            $telephone= $_SESSION['telephone'];
                            $email= $_SESSION['email'];
                            
                            
                        } else {
                          $pseudo = trim($_POST['pseudo']);
                          $telephone= intval($_POST['telephone']);
                          $email = trim($_POST['email']);
                          $created_by_member=0;
                        }
                            $categorie= trim($_POST['categorie']); 
                            $villes= trim($_POST['ville']);  
                            $titre = trim($_POST['titre']);  
                            $prix= intval($_POST['prix']); 
                            $description= trim($_POST['description']); 
                        

                        -
                        Edité par mouls22 2 décembre 2021 à 18:13:01

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 décembre 2021 à 17:45:17

                          Mais il y a un problème qui est le suivant:

                          Dans la photo ci-dessous quand c'est un membre ça ne récupère pas  l'id de la table membres. dans id_utilisateur=2, c'est un membre qui a un id 1 dans la table membres. De plus lorsque le formulaire est soumis ça ajoute les infos du membre dans la table utilisateur en lui accordant un id dans cette même table et qui sera insérée dans le champ id_utilisateur.  C'est comme si $id_utilisateur= $_session['id'] ne répondait pas

                          Y a-t-il un moyen pour ça récupérer l'id du membre dans la table membres.

                          Ou c'est une erreur dans le code?

                          if(isset($_POST['formannonce'])) {
                          
                            if (isset($_SESSION['id'])) {
                              $id_utilisateur=$_SESSION['id'];
                              $created_by_member=1;
                              $pseudo=$_SESSION['pseudo'];
                              $telephone= $_SESSION['telephone'];
                              $email= $_SESSION['email'];
                              
                              
                          } else {
                            $pseudo = trim($_POST['pseudo']);
                            $telephone= intval($_POST['telephone']);
                            $email = trim($_POST['email']);
                            $created_by_member=0;
                          }
                            $id_utilisateur=insertUtilisateur($pseudo,$telephone,$email);
                          $id_annonce = insertAnnonce($id_utilisateur,$created_by_member,$id_categorie,$villes,$titre,$description,$prix);
                          



                          -
                          Edité par mouls22 5 décembre 2021 à 18:12:48

                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 décembre 2021 à 10:10:58

                            Hello, 

                            Dans le cas où tu as un membre connecté qui vient de soumettre le formulaire, tu vas bien rentré dans ton if et affecter id_utilisateur=$_SESSION['id'] (et tous les autres champs de ta table membre). (ça c'est ok)

                            Le soucis c'est lorsque tu vas sortir de ta condition, tu vas écraser ta variable id_utilisateur avec ta fonction insertUtilisateur. Donc forcément quand tu souhaites créer une annonce rattachée à un membre, ce ne sera pas l'identifiant que tu as dans ta session qui va être insérer dans annonces, mais l'identifiant retourné par ta fonction insertUtilisateur

                            Tu dois insérer un utilisateur uniquement dans le cas où ce n'est pas un membre connecté qui poste l'annonce (donc quand $_SESSION['id'] est vide) 

                            -
                            Edité par hippomssc 7 décembre 2021 à 15:06:45

                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 décembre 2021 à 11:46:19

                              Bonjour skywalsku,

                              Merci encore pour ton retour. Excuses-moi, je n'ai pas bien compris:

                              Veux-tu dire que dans notre cas, on ne pourra jamais insérer id de la table "membres" dans id_utilisateur de la table "annonces"? Si tu veux dire oui, alors doit-on supprimer la table utilisateurs  et laisser uniquement la table membres qui sera liée à id_membre au lieu id_utilisateur.

                              <<Tu dois insérer un utilisateur uniquement dans le cas où ce n'est pas un membre connecté qui poste l'annonce (donc quand $_SESSION['id'] est vide) >>

                              Est-ce que je peux conclure ici que:

                              if(isset($_POST['formannonce'])) {
                              
                                if (isset($_SESSION['id']) AND !empty($_SESSION['id'])){
                                  $id_utilisateur=$_SESSION['id'];
                                  $created_by_member=1;
                                  $pseudo=$_SESSION['pseudo'];
                                  $telephone= $_SESSION['telephone'];
                                  $email= $_SESSION['email'];
                                  
                                  
                              } else {
                                $pseudo = trim($_POST['pseudo']);
                                $telephone= intval($_POST['telephone']);
                                $email = trim($_POST['email']);
                                $id_utilisateur=insertUtilisateur($pseudo,$telephone,$email);
                                $created_by_member=0;
                              }

                              Ce qui me donne l'erreur suivante:

                               SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`espace_membre`.`annonces`, CONSTRAINT `annonces_ibfk_1` FOREIGN KEY (`id_utilisateur`)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 décembre 2021 à 12:05:17

                                Nop je t'expliquais juste la raison pour laquelle tu n'avais jamais $id_utilisateur=$_SESSION['id'] lors de ton insertion : tu écrasais la valeur de $id_utilisateur avec ta fonction insertUtilisateur (ligne 17 sur le code de ton précédent message), et ce même lorsque c'était une annonce posté par un membre authentifié (avec $session['id'] initialisé qui aurait dû être insérer du coup).

                                Il fallait donc bien mettre insertUtilisateur dans le else, par contre dans ta condition remplace le "AND" par l'opérateur "&&" je pense que ton erreur vient de là :) 

                                Pour la table utilisateurs, dans l'idée j'aurais trouvé cela plus simple de la supprimer et gérer tous tes utilisateurs dans ta table membre (ou tous tes membres dans ta table utilisateurs peu importe...) mais après si tu trouves ça mieux d'avoir 2 tables distinctes pour gérer les 2, why not... Tous dépends de tes besoins et de ce qui te semble le plus simple pour toi

                                -
                                Edité par hippomssc 7 décembre 2021 à 12:05:50

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 décembre 2021 à 12:40:03

                                  J'ai essayé ça et j'ai toujours la même erreur:

                                  if(isset($_POST['formannonce'])) {
                                  
                                    if(isset($_SESSION['id']) && !empty($_SESSION['id'])){
                                      $id_utilisateur=$_SESSION['id'];
                                      $created_by_member=1;
                                      $pseudo=$_SESSION['pseudo'];
                                      $telephone= $_SESSION['telephone'];
                                      $email= $_SESSION['email'];
                                      
                                      
                                  } else {
                                    $pseudo = trim($_POST['pseudo']);
                                    $telephone= intval($_POST['telephone']);
                                    $email = trim($_POST['email']);
                                    $id_utilisateur=insertUtilisateur($pseudo,$telephone,$email);
                                    $created_by_member=0;
                                  }
                                      $villes= trim($_POST['ville']);  
                                      $titre = trim($_POST['titre']);  
                                      $prix= intval($_POST['prix']); 
                                      $description= trim($_POST['description']); 
                                      $id_categorie= ($_POST['categorie']);
                                    
                                  
                                    //on créé l'annonce
                                      $id_annonce = insertAnnonce($id_utilisateur,$created_by_member,$id_categorie,$villes,$titre,$description,$prix);



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 décembre 2021 à 15:05:03

                                    Ah oui... ta colonne id_utilisateur a une contrainte de clef étrangère sur ta table membre, donc dès que tu souhaites insérer un id qui provient de utilisateurs et non de membres, ça va être le bordel...

                                    J'vois 2 options possibles : 

                                    - soit tu supprimes ta contrainte de clef étrangère pour pouvoir insérer un peu ce que tu veux dedans (c'est pas ce qu'il y a de mieux normalement, mais pas non plus gravissime dans ton cas de figure et c'est un peu la seule solution si tu veux garder les 2 tables). Faudra juste que tu check bien que tu insères pas une annonce sans utilisateur qui lui est rattaché 

                                    - soit tu supprimes une de tes 2 tables utilisateurs ou membres et tu gères tous tes utilisateurs (membre et simple utilisateur non connectés) dedans... Pour faire la distinction entre les deux tu peux rajouter une colonne, genre un booléen un peu comme dans ta table annonce (tu pourras supprimer ce dernier si tu adoptes cette approche)...  Et là tu pourras garder ta clef étrangère pour faire le lien entre la table utilisateurs et annonces

                                    Y'a peut être d'autres solutions mais c'est les deux qui me viennent à l'esprit pour l'instant

                                    -
                                    Edité par hippomssc 7 décembre 2021 à 15:18:30

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 décembre 2021 à 17:09:36

                                      J'ai supprimé la table utilisateurs, et par conséquent l'id_utilisateur de la table annonces. J'ai donc gardé uniquement la table membres et dedans le champ "created_by_member". D'autre part Pseudo, telephone, et email je les ai insérés dans la table annonces. Le formulaire est soumis correctement.

                                      Dernière tâche et j'arrête de t'embêter:

                                      Je cherche à echo le nombre d'annonces pour les membre dans la page profil.php, et donc du coup j'ai fait une requête:

                                      if(isset($_SESSION['id'])) {
                                         $session = intval($_SESSION['id']);
                                         $requser = $bdd->prepare('SELECT * FROM membres, annonces
                                      WHERE
                                       membres.id = ?
                                      AND created_by_member=1 ');
                                         $requser->execute(array($session));
                                         $userinfo = $requser->fetch();

                                      Et pour echo j'ai fais ça:

                                      echo ".$userinfo[created_by_member]."



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        7 décembre 2021 à 17:24:44

                                        Si tu veux récupérer les annonces d'un utilisateur il faut que tu sélectionne dans ta table annonces les annonces ayant comme id_utilisateur (ou created_by je sais plus comment tu as appelé la colonne) l'identifiant que tu as dans ta session.

                                        essaye avec ça : 

                                        if(isset($_SESSION['id'])) {
                                           $session = intval($_SESSION['id']);
                                           $requser = $bdd->prepare('SELECT * FROM annonces
                                        WHERE
                                         annonces.created_by = ?');
                                           $requser->execute(array($session));
                                           $userinfo = $requser->fetch();

                                        Après tu peux utiliser count pour compter le nombre de résultat : https://www.php.net/manual/fr/function.count.php

                                        -
                                        Edité par hippomssc 7 décembre 2021 à 17:25:37

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 décembre 2021 à 18:49:16

                                          On y est presque, c'est le nombre 22 qui s'affiche. Or le membre connecté ne possède qu'une seule annonce:

                                            $nbreannonce = $bdd->prepare('SELECT * FROM annonces
                                             WHERE
                                              annonces.created_by_member = ?');
                                                $nbreannonce->execute(array($session));
                                                $nbre= $nbreannonce->fetch();

                                          Et pour echo c'est ça: 

                                          <?php echo count($nbre)?>




                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            8 décembre 2021 à 9:43:43

                                            Si tu fais un var_dump de $nbre, il t'affiche quoi ?

                                            Sinon test avec ça : https://www.php.net/manual/fr/pdostatement.rowcount.php

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              8 décembre 2021 à 12:29:18

                                              Là ça affiche le nombre le 2, ie le nombre de membres ayant créer l'annonce:

                                              Le code:

                                               $session = intval($_SESSION['id']);
                                                 $nbreannonce = $bdd->prepare('SELECT COUNT(*) FROM annonces
                                                 WHERE
                                                  annonces.created_by_member = ? AND annonces.id='.$session.'');
                                                    $nbreannonce->execute(array($session));
                                                    $nbre= $nbreannonce->fetch();

                                              Et en var_dump:

                                              array (size=2)
                                                'COUNT(*)' => string '0' (length=1)
                                                0 => string '0' (length=1)




                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                8 décembre 2021 à 15:01:48

                                                Si tu utilises COUNT dans ta requête sql, t'as pas besoin de l'utiliser à nouveau en php. COUNT en sql (comme en php) va te permettre de compter le nombre de lignes qui sont retournées par cette requête donc ici dans l'exemple que tu m'a donné 0. 

                                                Y'a aussi un petit soucis dans ta requête : elle te retourne les annonces qui sont créées par le membre dont l'id correspond à l'id que tu as stocké en session (donc ton WHERE annonces.created_by = ? dans ta requête) et qui ont pour identifiant également l'id que tu as stocké en session (AND annonces.id=$session).

                                                Toi tu veux uniquement les annonces créés par le membre correspondant à l'id de la session. Donc faut que tu supprimes la seconde partie de ta requête.

                                                Après t'auras juste à afficher ce que te retourne ta requête (sans utiliser le count en php)

                                                -
                                                Edité par hippomssc 8 décembre 2021 à 16:34:16

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  8 décembre 2021 à 19:02:48

                                                  J'ai l'erreur suivante: Notice: Array to string conversion in

                                                   $session = intval($_SESSION['id']);
                                                     $nbreannonce = $bdd->prepare('SELECT COUNT(*) FROM annonces
                                                     WHERE
                                                      annonces.created_by_member = ?');
                                                        $nbreannonce->execute(array($session));
                                                        $nbre= $nbreannonce->fetch();

                                                  Et dans echo

                                                  <?php echo $nbre;?>





                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    9 décembre 2021 à 9:15:46

                                                    L'erreur me paraît assez explicite, ta variable est un tableau associatif (comme tu peux le voir dans ton var_dump de ton précédent message). Donc tu ne peux pas echo tout un tableau, il faut que tu spécifie l'index que tu souhaites avoir.

                                                    echo $nbre['COUNT(*)'];
                                                    
                                                    // ou alors
                                                    
                                                    echo $nbre[0];



                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      9 décembre 2021 à 12:17:59

                                                      L'erreur a disparu, mais le nombre d'annonces ne s'affiche pas. Je vais arrêter de t'embêter, et merci pour tout le temps que tu m'as accordé. Tu as beaucoup fait et tu m'as aidé à organiser mes tableaux. Bien à toi skywalskurt :)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Formulaire inscrits et non-inscrits en Mysql

                                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                      • Editeur
                                                      • Markdown