Joindre 3 tables mysql

Fermé
max30 - 28 nov. 2021 à 20:34
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 1 déc. 2021 à 09:43
Bonjour, j'essaie de joindre 3 tables (annonces, image_products et membres).
Les champs pour chaque tables:
annonces: (id, nompseudo, categorie, ville, titre, presentation, prix, telephone, email, date)
image_products: (id_product et filename_product)
membres: (id, nom, telephone, mail, motdepasse, dateinscription).

Les tables "annonces" et "image_products" sont liées car il s'agit des images des annonces.

Et pour la table "membres", le but c'est de garder les champs,nom, mail et telephone au lieu des champs similaires de "annonce, pour que les utilisateurs inscrits puissent poster, en affichant les détails de l'annonce (catégorie, description...) présent dans la table "annonces".
Je ne sais pas comment procéder dans ce cas de figure, si vous pouvez m'éclairer, comme d'habitude, merci :)
A voir également:

14 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
28 nov. 2021 à 20:42
bonjour,
par quels champs les tables sont-elle liées?
peux-tu donner un exemple de ce que contiennent les tables?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
28 nov. 2021 à 21:11
Bonjour,

Je vois déjà quelques soucis dans la concepetion de tes tables...
Pour la table annonces
annonces: (id, nompseudo, categorie, ville, titre, presentation, prix, telephone, email, date)
Si les informations telephone et email sont ceux de l'utilisateur qui a créé l'annonce.. alors il ne faut pas les remettre dans cette table.

Ensuite, pour le lien entre ta table annonces et membres .. il faudrait que tu stockes l'id du membre au lieu de son pseudo.

La jointure entre ces deux tables pouvant alors se faire facilement avec un simple left Join
SELECT *
FROM annonces A 
LEFT JOIN membres M  ON M.id = A.id_membre


ensuite pour les images; si tu peux en avoir plusieurs par annonce, le plus simple est de faire une seconde requête lorsque tu veux les récupérer.

Sii malgré tout tu veux le faire en une seule requête.. penches toi sur la jointure INNER JOIN
( à condition au tu aies au moins une image par annonce sinon elle ne sera pas présente dans le résultat de la requête)
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 08:35
Bonjour Jordane,
Merci pour ton éclairage.
Pour les inscrits: Dans la table annonce j'ai crée un nouveau champ "id_membre" lié à "id" de la table "membres' .
Pour les non-inscrits, j'ai placé les champs nompseudo, mail et telephone dans une autre table "membresni" . Plus simple, voire Photo:




Ensuite va-t-il falloir creer d'autre fonctions comme afficherAnnoncemembre() pour les membres inscrits, à côté de la fonction afficherAnnonce() pour les non-inscrit? et refaire d'autres fonctions (ex: rechercheannonce() et rechercheannoncemembre())


<<ensuite pour les images; si tu peux en avoir plusieurs par annonce, le plus simple est de faire une seconde requête lorsque tu veux les récupérer.
Si malgré tout tu veux le faire en une seule requête.. penches toi sur la jointure INNER JOIN>>

==>Si tu penses que ça ne va pas compliquer les choses plus tard, je peux faire tout dans une même requête, et ajouter une image par défaut, si dans une annonce il n' y a pas d'images.

Voici ce que ça donne si je fait tout dans une si même requête:

function afficherAnnoncemembre(){
    global $bdd;
    $res = []; 
    $sql = 'SELECT *
    FROM annonces A 
    LEFT JOIN (membres M 
    INNER JOIN image_products I ON I.id_product= M.membres_id)
    ON M.id = A.id_membre';

// suite du code pour ne pas faire long
      


Faudrait-il refaire ça pour les autres fonctions des non-inscrits en remplaant membres par membresni?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 nov. 2021 à 08:56
C'est quoi cette nouvelle table membresni ?
Les infos qui sont dedans ne sont pas identiques (et/ou ne peuvent pas y être stockées) à celles de membres ?
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 09:05
Je pensais qu'il fallait faire une table aussi pour les non inscrits.
Si, elles sont identiques, sauf que pour les non inscrits il n'y pas de mot de passe, ni dateinscription.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 nov. 2021 à 09:31
Je pense que tu pourrais partir sur un modèle comme ça


Et dans la requête SQL, avec des IF pour voir si le champ id_membre est renseigné ou non pour savoir quelles infos (de quelle table) récupérer
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 12:37
J'ai fait exactement comme le modèle que tu as mis, mais la requête n'arrive pas à passer.

  $sql = 'SELECT * annonces IF (utilisateurs.id_membre is null)
     INNER JOIN categories
     ON annonces.id_categorie= categories.id
     INNER JOIN images_annonces
     ON annonces.id= id_annonce
     INNER jOIN utilisateurs
     on annonces.created_by = utilisateurs.id

     ELSE( INNER JOIN categories
     ON annonces.id_categorie= categories.id
     INNER JOIN images_annonces
     ON annonces.id= id_annonce
     INNER jOIN membres
     on annonces.created_by = membres.id


     )
     
     
     ';
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 nov. 2021 à 14:23
Commence déjà par ça :


SELECT  A.*
               ,U.*
              ,M.*
              ,C.*
FROM annonces A
LEFT JOIN utilisateurs U ON U.id = A.created_by
LEFT JOIN membres M ON M.id = U.id_membre
LEFT JOIN categories C ON C.id = A.id_categorie


0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
29 nov. 2021 à 14:29
Et concernant INSERT into pour 5 tables dans une même fonction? ie comme la première:

function insertAnnonce($nompseudo,$categorie, $villes, $titre, $presentation, $prix, $phone, $mail){
    global $bdd;
   
    $sql= "INSERT INTO annonces(nompseudo,categorie,ville,titre,presentation,prix,telephone,email) VALUES(?,?,?,?,?,?,?,?)";
    $datas= array($nompseudo,$categorie, $villes, $titre, $presentation, $prix, $phone, $mail);
    //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;
    }
  
}

Faut-il faire 5 requêtes?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 14:35
oui une requête par table
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 16:30
Quand je remplis le formulaire, ça affiche2 erreurs
Erreur1 : Notice: Undefined index: motdepasse
Erreur2 rreur ! SQLSTATE[HY000]: General error: 1364 Field 'id_categorie' doesn't have a default value Les datas : Array ( [0] => [1] => [2] => 0 [3]

Pour la 1ère erreur, il est évident qu'il faut que l'utilisateur soit connecté pour que ça ne s'affiche pas.
NB: le membre se connecte à partir de la page connexion.php et non pas à partir du formulaire

Il va falloir je pense une, une condition IF dans la fonction insertAnnonce entre les 2 requêtes membres et utilisateurs.




Voici le code:

function insertAnnonce( $titre, $description, $prix, $villes, $libelle, $pseudo, $email, $telephone, $motdepasse){
  global $bdd;
 
  //Requete 1

  $sql= "INSERT INTO annonces(titre,description,prix,ville) VALUES(?,?,?,?)";
  $datas= array($titre,$description, $prix, $villes);
  //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

  $sql= "INSERT INTO categories(libelle) VALUES(?)";
  $datas= array($libelle);
  //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 3
  $sql= "INSERT INTO utilisateurs(pseudo, email, telephone) VALUES(?,?,?)";
  $datas= array($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
  $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;
  }




}


 $location= "pictures/";


 //----------------------------------------------------------//
// Traitement du submit
//----------------------------------------------------------//

if(isset($_POST['formannonce'])) {
    $telephone= intval($_POST['telephone']);
    $email = trim($_POST['email']); 
    $libelle= trim($_POST['libelle']); 
    $villes= trim($_POST['ville']);  //  
    $titre = trim($_POST['titre']); 
    $pseudo = trim($_POST['pseudo']);
    $prix= intval($_POST['prix']); 
    $description= trim($_POST['description']); 
    $motdepasse= sha1($_POST['motdepasse']); 
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 nov. 2021 à 17:35

$sql= "INSERT INTO categories(libelle) VALUES(?)";
$datas= array($libelle);

Attention, si tu reprends le modèle que je t'ai donné.. ce n'est pas le libellé de la catégorie mais son ID que tu dois stocker

De plus.. tu as mis des RETURN après chaque requête... sauf que ça .. ça serait bon si tu avais placé chaque requête dans une fonction et non toutes ensemble comme tu as essayé de le faire
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 18:41
Mais le libellé sert à connaitre la catégorie de l'annonce, s'il s'agit d'une moto par exemple etc.. Donc on coche la catégorie du produit (ex:produit 1), qui a pour name= libelle
Il s'agit d'un id auto incrémenté, on ne peut pas le stocker. voir photo



Pour le code, chaque requête a été placée dans une fonction:
//Requete 1

function insertAnnonce( $titre, $description, $prix, $villes){
  global $bdd;
 

  $sql= "INSERT INTO annonces(titre,description,prix,ville) VALUES(?,?,?,?)";
  $datas= array($titre,$description, $prix, $villes);
  //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( $libelle){
    global $bdd;
  $sql= "INSERT INTO categories(id, libelle) VALUES(,?)";
  $datas= array( $libelle);
  //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($pseudo,$email, $telephone){
   //Requete 3
  $sql= "INSERT INTO utilisateurs(pseudo, email, telephone) VALUES(?,?,?)";
  $datas= array($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;
  }




}



 //----------------------------------------------------------//
// Traitement du submit
//----------------------------------------------------------//

if(isset($_POST['formannonce'])) {
    $telephone= intval($_POST['telephone']); .
    $email = trim($_POST['email']); // 
    $libelle= trim($_POST['libelle']);  // 
    $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($titre, $description, $prix, $villes, $libelle, $pseudo, $email, $telephone, $motdepasse);


Question: comment changer $id_annonce avec toutes ses fonctions.?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 nov. 2021 à 19:21
Mais le libellé sert à connaitre la catégorie de l'annonce, s'il s'agit d'une moto par exemple etc.. Donc on coche la catégorie du produit

Catégorie que tu proposes via une liste déroulante ( un <select> html ) et donc, par conséquent, tu disposes de son ID en plus du libellé ... et c'est bien l'ID que tu vas aller stocker dans la bdd
A moins que tu veuilles que les gens puissent écrirent dans un champ text libre la "catégorie" qu'ils veule ??
Dans ce cas.. tu risque de te retrouver avec voiture, auto, automobile, Voiture, Auto, Automobile, .. sans compter les erreurs de saisies genre Autmobile ...
Et ça sera pire avec les mots pouvant avoir des accents ...


Donc non... les catégories.. c'est toi qui les créés ... et qui les proposes ensuite à tes utilisateurs...
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
29 nov. 2021 à 21:51
Je pense que j'ai réglé le problème en attribuant des valeurs "null" à celles qui n'avaient pas de valeurs par défaut. C'est bien ça en photo?



Les données dans le formulaire n'apparaissent que pour les table annonces et images_annonces. Les autres tables membres, utilisateurs, catégories sont vides



L'erreur: Notice: Undefined index: motdepasse in C:\wamp64\www\Projetsite\commandes.php on line 152


Je pense que le reste vient de la fin du code au niveau de $id_product à la fin:


<?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( $titre, $description, $prix, $villes){
  global $bdd;
 

  $sql= "INSERT INTO annonces(titre,description,prix,ville) VALUES(?,?,?,?)";
  $datas= array($titre,$description, $prix, $villes);
  //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( $libelle){
    global $bdd;
  $sql= "INSERT INTO categories(id, libelle) VALUES(,?)";
  $datas= array( $libelle);
  //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($pseudo,$email, $telephone){
   //Requete 3
  $sql= "INSERT INTO utilisateurs(pseudo, email, telephone) VALUES(?,?,?)";
  $datas= array($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;
  }




}



 //----------------------------------------------------------//
// Traitement du submit
//----------------------------------------------------------//

if(isset($_POST['formannonce'])) {
    $telephone= intval($_POST['telephone']); .
    $email = trim($_POST['email']); // 
    $libelle= trim($_POST['libelle']);  // 
    $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($titre, $description, $prix, $villes, $libelle, $pseudo, $email, $telephone, $motdepasse);


// si on a bien un id_product, on upload et insère les images
    if(!empty($id_annonce)){
      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éé !";
    }
}

 ?>




0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
29 nov. 2021 à 22:34
Comme on ne sat rien de ton formulaire... difficile de voir ce qui cloche.

Par contre, normal que tu n'aies que deux tables qui se remplissent... vu que tu n'appelles pas les autres fonctions.

Et puis bon... tu ne réponds pas à mes questions... (sur le fonctionnement attendu pour les catégories par exemple..)

Si tu ne fais pas d'efforts..ça va devenir difficile.
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 30 nov. 2021 à 07:27
Voila mon 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 dans l'autre page, pour créer l'annonce en appelant les fonctions:

//on créé l'annonce
    $id_annonce = insertAnnonce($titre, $description, $prix, $villes);
    $id_categorie= insertCategorie($categorie);
    $id_utilisateur= insertUtilisateur($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($id_utilisateur)) ){
      savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img1,$location);
      savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img2,$location);
      savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img3,$location);
      savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img4,$location);
      savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img5,$location);


Erreur1: Undefined index: motdepasse in
Erreur2Undefined variable: bdd in
Fatal error: Uncaught Error: Call to a member function prepare() on null in
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
30 nov. 2021 à 16:51
Jesuis intrigué pour la suite! Je pense que j'ai compris ce que tu voulais dire concernant stocker l'id==> Il fallait donc ajouter id_categorie dans sql= insert into, ce que j'avais oublié de faire.
Je pense que l'ai fait, mais là j'ai l'erreur suivante: Integrity constraint violation: 1048 Le champ 'id_categorie' ne peut �tre vide (null)
et ces erreurs qui sont plus au niveau d code:
Undefined variable: id_categorie in C
Undefined variable: created_by in
Undefined variable: id_membre in
Les vois-tu?
<?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']); // attention, ça fera disparaitre le 0 qui se trouve en première position si il y en a un ...
    $email = trim($_POST['email']); // htmlspecialchars ne s'utilise que pour de l'affichage.. pas pour insérer les données en bdd !
    $categorie= trim($_POST['categorie']);  // htmlspecialchars ne s'utilise que pour de l'affichage.. pas pour insérer les données en bdd !
    $villes= trim($_POST['ville']);  // htmlspecialchars ne s'utilise que pour de l'affichage.. pas pour insérer les données en bdd !
    $titre = trim($_POST['titre']);  // htmlspecialchars ne s'utilise que pour de l'affichage.. pas pour insérer les données en bdd !
    $pseudo = trim($_POST['pseudo']);
    $prix= intval($_POST['prix']); // tu n'auras pas de prix avec virgule ?? si oui, ce n'est pas int mais float qu'il faut utiliser !
    $description= trim($_POST['description']); // nl2br s'utilise pour l'affichage;. pas pour insérer en bdd !
    $motdepasse= password_hash($_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(!$id_annonce AND !$id_categorie AND (!$id_membre ||!$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éé !";
    }
}

 ?>


Et ici 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>
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
30 nov. 2021 à 17:50
COmmence par modifier ta liste de catégories ...
c'est bien des ID "numériques" qu'on doit trouver dans les values des options
   <label for="categorie" >Catégorie</label>
                <select id ="categorie" name="categorie">
                    <optgroup label= "Immo">
                    <option value= "1">Appart</option>
                    <option value= "2">Maison</option>
                    <option value= "3">Terrain</option>
                    <option value= "4">Location</option>
                </optgroup> <br> <br>
                </select> <br> <br>



Et puis...Désormais, tu as une table pour les stocker...
Il serait donc bien de les lister depuis cette table pour alimenter ton select
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
30 nov. 2021 à 18:33
Je viens de comprendre maintenant ce que tu veux faire avec les ID numériques. Mais ça va impacter la barre de recherche. C'est à dire qu'il va falloir que l'utilisateur tape un mot précis pour que sa recherche soit effectuée(ie s'il tape auto au lieu de automobile la barre de recherche n'affichera aucun résultat). Il faudra qu'il tape le mot tel que défini dans la liste.
De plus, on n'a pas besoin de la table membre(is les inscrits) pour les annonces. Il peut suffire simplement de récupérer l'id du membre que nous avions stocké en session et l'affecter à notre champ 'created_by' . T'en penses quoi?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
30 nov. 2021 à 18:50
Ben non...
Tu ne connais pas le "like" en sql ??
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
30 nov. 2021 à 18:58
On y va alors:
         <label for="categorieannonce"><?php echo $lang['ca'];?></label>
                <select id ="categorie" name="categorie">
                    <optgroup label= <?php echo $lang['immo'];?>>
                    <option value= "1"><?php echo $lang['appa'];?></option>
                    <option value= "2"><?php echo $lang['mv'];?></option>
                    <option value= "3"><?php echo $lang['terr'];?></option>
                    <option value= "4"><?php echo $lang['loc'];?></option>
                    <option value= "5"><?php echo $lang['bur'];?></option>
                </optgroup> <br> <br>


                <optgroup label= "Véhicules">
                    <option value= "6"><?php echo $lang['voit'];?></option>
                    <option value= "7"><?php echo $lang['mot'];?></option>
                    <option value= "8"><?php echo $lang['pav'];?></option>
                    <option value= "9"><?php echo $lang['vel'];?></option>
                    <option value= "10"><?php echo $lang['vp'];?></option>
                </optgroup>


                <optgroup label= "<?php echo $lang['im'];?>">
                    <option value= "11"> <?php echo $lang['tele'];?></option>
                    <option value= "12"> <?php echo $lang['ordi'];?></option>
                    <option value= "13"> <?php echo $lang['ai'];?></option>
                    <option value= "14"><?php echo $lang['ob'];?></option>
                </optgroup>

                <optgroup label= "<?php echo $lang['C'];?>">
                    <option value= "15"> <?php echo $lang['pr'];?></option>
                    <option value= "16"> <?php echo $lang['col'];?></option>
                </optgroup>



                </select>


La suite...?
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
1 déc. 2021 à 09:43
Voila la table catégorie listée. Je présume qu'on n'aura pas besoin d'une fonction insertCategorie. Je vois ton idée venir, car ça facilitera les choses dans le futur

Mais comment procédera-ton pour created_by?
0