IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Insertion liaison multiple par formulaire php


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Archéologue
    Inscrit en
    Mars 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Archéologue
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2019
    Messages : 134
    Par défaut Insertion liaison multiple par formulaire php
    Bonjour à vous,
    je vous préviens de suite, je suis légèrement débutant en php et mysql et je pose cette discussion car je n'arrive pas à trouver les messages ou les tutoriels qui conviennent à mon problème. du coup ça va être assez théorique car mon code n'est pas très avancé.
    En fait, j'ai un formulaire en php qui créé une entrée dans une table A, mais en même temps l'utilisateur peut choisir dans une liste déroulante plusieurs lignes d'une table B qui sera donc liée.
    Du coup, vu qu'il s'agit d'un lien un à plusieurs, je passe par une table intermédiaire C qui gérera les liens entre les ID de la table A et de la table B.
    Mais du coup, j'aurais deux questions :
    - où pourrais-je trouver une bonne explication pour arriver à choper les infos de la liste déroulante du formulaire pour arriver à les insérer dans la table C (j'ai essayé avec une procédure foreach mais je bloque un peu) ?
    - comment je peux insérer dans la table C l'ID de la table A alors que celui-ci ne s'incrémentera automatiquement qu'à la création de la ligne ?

    Comme je me doute que ce que je pose comme question est un peu abstrait, je vous mets donc juste le code actuel, sachant qu'il ne fonctionne pas. La table A est donc la table "bibliographie" dont l'ID s'autoincrémente et la table B est la table "auteur". J'ai appelé la table C "lien_auteur_biblio"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    //Récupération des données du formulaire
    if(isset($_POST['id_auteur'])) {$id_auteur []=$_POST['id_auteur'];}
    else   {   $auteur="";}
    if(isset($_POST['annee']))    {  $annee=$_POST['annee'];}
    else    {  $annee="";}
    if(isset($_POST['reference']))    {  $reference=$_POST['reference'];}
    else    {  $reference="";}
     
    // On vérifie si les champs sont vides
    if(empty($id_auteur) OR empty($annee) OR empty($reference))
        {
        echo '<font color="red">Attention, un champ ne peut pas être vide !</font>';
        }
     
    // Aucun champ n'est vide, on peut enregistrer dans la table biblio
    else     
     
         $connexion=include 'dunum_connexion_db.php';  
    				$insertion = $connexion->prepare ("INSERT INTO `bibliographie`(ID_Biblio,`Annee_Biblio`, `Reference`) VALUES(Null,'$annee','$reference')");
    				$insertion->execute();	
    //insertion dans la table de liens auteur_biblio
    	foreach ($id_auteur as $row=>$value){
    				$insertion_lien = $connexion->prepare ("INSERT INTO `lien_auteur_biblio`(ID_Biblio,`ID_Auteur`) VALUES('???','$value[]')");
    	$insertion_lien->execute();};
    		echo "<p>Votre référence a bien été insérée. Vous allez être redirigés vers la liste bibliographique"."<br>";
    Merci vraiment beaucoup d'avance à la personne qui, en ces temps de confinement, aura la bonté de lire ce message et de me répondre !!

    Clément

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 507
    Par défaut
    Citation Envoyé par Clement_archeo Voir le message
    - où pourrais-je trouver une bonne explication pour arriver à choper les infos de la liste déroulante du formulaire pour arriver à les insérer dans la table C (j'ai essayé avec une procédure foreach mais je bloque un peu) ?
    Tout dépend de la structure html que t'utilises, est-ce que la liste est à multiple choix ?

    Citation Envoyé par Clement_archeo Voir le message
    - comment je peux insérer dans la table C l'ID de la table A alors que celui-ci ne s'incrémentera automatiquement qu'à la création de la ligne ?
    Pour cela il existe lastInsertId() qui permet de récupérer le dernier id (auto-incrémente) inséré.

    Et si tu veux qu'on t'aide vraiment, il va falloir nous montrer la structure de tes tables, essaies de les exporter dans un fichier .sql et ajoute les dans la discussion, comme ça on pourra tester...

  3. #3
    Membre confirmé
    Homme Profil pro
    Archéologue
    Inscrit en
    Mars 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Archéologue
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2019
    Messages : 134
    Par défaut
    Bonjour et merci de cette première réponse Toufik83.
    Effectivement, dans le formulaire, c'est une liste à choix multiple qui est utilisée. le code pour la construire est ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $connexion=include 'dunum_connexion_db.php';
    // Requête SQL
    $req = "SELECT * FROM auteur ORDER BY Nom_auteur";
    // Exécution de la requête
    $prepared=$connexion->prepare($req);
    $prepared->execute();
    // Construction de la chaîne de caractères qui fait la // liste
    $select='<select input type="select"  multiple class="form-control" name="id_auteur" required="required"><OPTION VALUE="">Choisissez un ou plusieurs auteurs</OPTION>';
    if($prepared->rowCount()>0){ 
       while($data=$prepared->fetch(PDO::FETCH_ASSOC)){
          $select.= "<option value='".$data['ID_Auteur']."'>".$data['Nom_Auteur']."</option>";   }
    }
    else {$select.="<option value=0>Aucune donnée n'a été trouvée</option>";}
    $select.="</select>";
    echo $select;
    $connexion=null;
    Pour les tables, elles sont très simples en réalité, je vous joins la structure des trois tables incriminées : base_local.sql

    Merci d'avance de votre aide

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Globalement la procédure est la suivante :

    - Dans le formulaire , la liste des éléments B doit faire référence à leur ID
    Donc d'un point de vue purement HTML tu vas générer quelque chose comme ca :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <select>
        <option value="1">1er element de B</option>
        <option value="2">2er element de B</option>
       <option value="n">neme element de B</option>
    </select>

    Quand tu reçois ton formulaire , la première chose à faire est de creer l'élément de la table A
    Une fois celà fait tu peux demander son id comme l'a mentionné Toufik83.

    Tu vas donc te retrouver avec l'id d'un élément de A et l'id d'un élément de B (ou plusieurs si choix multiple)

    Il ne te reste donc plus qu'à faire les insertion dans C puisque tu as tous les éléments.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Archéologue
    Inscrit en
    Mars 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Archéologue
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2019
    Messages : 134
    Par défaut
    Merci de vos réponses.
    Effectivement, je pense que c'est la marche à suivre et je vais essayé d'utiliser lastInsertId().
    Par contre, auriez vous juste un lien pour uen aide au code d'insertion de l'array que je vais récupérer des valeurs de la liste déroulante ?
    Comme vous pouvez le voir sur mon premier message, j'ai tenté une procédure avec foreach, mais elle ne fonctionne pas.
    Etant débutant, j'aurais juste besoin d'un lien vers l'explication pas à pas de cette insertion.
    Merci

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 507
    Par défaut
    En gros voilà un exemple fonctionnel que je viens de tester :

    Le fichier de connexion à la base de donnée (la mienne s'appelle "test", n'oublis pas de mettre le nom de la tienne).

    dunum_connexion_db.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php 
    try{
    	$connexion=new PDO('mysql:host=localhost;dbname=test', 'root', ''
    		, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
    }catch(Exception $e){
    	echo "Erreur oonnection à la base : ".$e->getMessage();
    }
    Puis le fichier index.php qui génère un <form methd="post" action="traitement.php"> qui contient le <select> en question et les champs référence et année + un bouton de type submit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php 
    include 'dunum_connexion_db.php';
    // Requête SQL
    $req = "SELECT * FROM auteur ORDER BY Nom_auteur";
    // Exécution de la requête
    $prepared=$connexion->prepare($req);
    $prepared->execute();
    // Construction de la chaîne de caractères qui fait la liste 
    // (les crochets [] dans le name du select est obligatoire si tu veux envoyer/récupérer plusieurs valeurs de la liste)
    $select='<select input type="select"  multiple class="form-control" name="id_auteur[]" required="required">'
    	.'<OPTION VALUE="">Choisissez un ou plusieurs auteurs</OPTION>';
    if($prepared->rowCount()>0){ 
       while($data=$prepared->fetch(PDO::FETCH_ASSOC)){
          $select.= "<option value='".$data['ID_Auteur']."'>".$data['Nom_Auteur']."</option>";   }
    }
    else {$select.="<option value=0>Aucune donnée n'a été trouvée</option>";}
    $select.="</select>";
    echo "<form method='post' action='traitement.php'>"
    	.$select
    	.'<input type="text" name="annee" value="2020"/>'
    	.'<input type="text" name="reference" value="Ref 2020" />'
    	.'<input type="submit" value="Ok">'
    .'</form>';
    $connexion=null;
    Et finalement le fichier d’insertion dans les tables (traitement.php)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?php 
    include 'dunum_connexion_db.php';
    //Initialisation des variables pour ne pas utiliser les ELSE 
    $id_auteur="";$annee="";$reference="";
     
    //Récupération des données du formulaire
    if(isset($_POST['id_auteur'])) {$id_auteur=$_POST['id_auteur'];}
     
    if(isset($_POST['annee']))    {  $annee=$_POST['annee'];}
     
    if(isset($_POST['reference']))    {  $reference=$_POST['reference'];}
     
     
    // On vérifie si les champs sont vides
    if(empty($id_auteur) OR empty($annee) OR empty($reference)){//il vaut mieux remplacer les OR par || .....
    	echo '<font color="red">Attention, un champ ne peut pas être vide !</font>';
    	exit();//au cas ou l'un des variables est vide "", on quitte le script.
    }
     
    // Aucun champ n'est vide, on peut enregistrer dans la table biblio
    //NE JAMAIS PASSER LES VARIABLES EN BRUT DANS LA REQUÊTE, IL FAUT LA PRÉPARER!
    else {
    	//Le ID_Auteur dans bibliographie ne sert à rien vu que tu l'insères dans la table ien_auteur_biblio, non ? donc tu peux le supprimer de la table bibliographie
    	$insertion = $connexion->prepare ("INSERT INTO `bibliographie`(ID_Biblio,`Annee_Biblio`, `Reference`) VALUES(Null,?,?)");
    	$insertion->execute([$annee,$reference]);
    	$lastIdBiblio=$connexion->lastInsertId();
    	if($lastIdBiblio>0){//si l'insértion dans bibliographie s'est bien déroulée, on continue	
    		//insertion dans la table de liens auteur_biblio
    		//préparation de la requête EN DEHORS du foreach (c'est l’intérêt des requêtes préparées!)
    		$insertion_lien = $connexion->prepare ("INSERT INTO `lien_auteur_biblio`(ID_Biblio,`ID_Auteur`) VALUES(?,?)");
    		foreach ($id_auteur as $row=>$value){
    			$insertion_lien->execute([$lastIdBiblio,$value]);
    		}
    	}
    	else echo "Erreur d’insertion dans bibliographie !";
    }
    echo "<p>Votre référence a bien été insérée. Vous allez être redirigés vers la liste bibliographique"."<br>";
    J'ai commenté le maximum pour t'expliquer un peu comment ça fonctionne, si tu as des question n'hésite pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] Insertions multiples par formulaire
    Par julienmarliac.net dans le forum Symfony
    Réponses: 3
    Dernier message: 03/08/2010, 14h31
  2. [PHP 5.0] envoi email multiple sur formulaire php
    Par trobador dans le forum Langage
    Réponses: 6
    Dernier message: 21/04/2010, 14h04
  3. [MySQL] Transfert image par formulaire PHP
    Par fasyr dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/11/2008, 19h20
  4. Insertion de multiples sous formulaires
    Par EGSway dans le forum IHM
    Réponses: 1
    Dernier message: 10/10/2007, 20h17
  5. Réponses: 3
    Dernier message: 13/07/2006, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo