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 :

Insert into multiple : Répétition des valeurs en fonction du nombre de lignes [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 110
    Points : 57
    Points
    57
    Par défaut Insert into multiple : Répétition des valeurs en fonction du nombre de lignes
    Salut !

    Le titre du sujet ne doit pas vous sembler très clair... je m'explique.

    Je souhaite faire un INSERT sur deux tables différentes.

    J'ai une table "joueurs" qui va avoir un certain nombre de lignes avec les infos nom, prenom, etc...

    Je voudrais leur attribuer dans une seconde table un club, une saison, etc...

    Pour éviter de répéter cette dernière info qui sera la même sur chaque entrée de joueur, j'ai fait une boucle qui prend en compte les deux INSERT comme ci-dessous.
    Je l'ai simplifiée, j'ai enlevé les déclarations de variables, etc...

    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
    $totalNom = sizeof($InsertNom);
     
    for($i=0;$i<$totalNom;$i++) {
     
    	$sql->DatabaseConnexion();
    	$ajout = $sql->query("INSERT INTO "._TJOUEUR_." VALUES(
    						'',
    						'".$InsertNom[$i]."',
    						'".$InsertPrenom[$i]."'
    						)") or die(mysql_error());	
     
    	$ajout2 = $sql->query("INSERT INTO "._TCLUB_." VALUES(
    						'',
    						'".$InsertClub[$i]."',
    						'".$InsertSaison[$i]."'
    						)") or die(mysql_error());						
     
    	$sql->DatabaseClose();
     
    }
    }
    Résultat actuel :

    Ma table "joueurs" affiche bien les infos entrées du formulaire (prenons par exemple : 5 joueurs).
    Dans la table carrière, j'ai bien le même nombre de lignes insérées que dans "joueurs" (5) mais je n'ai l'info club, saison uniquement sur la première ligne.
    Je n'arrive pas à trouver la solution pour insérer le même contenu sur les autres lignes...

    Je ne sais pas si j'ai été clair... si vous aviez une petite aide à m'apporter?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut

    pas très clair, plusieurs remarques :
    • A chaque boucle, tu ouvres et fermes la connexion à la base de données !
      Pourquoi ne pas l'ouvrir une fois et la fermer à la fin du traitement ? Ou mieux, tu l'ouvres et tu l'oublies (PHP gère pour toi la clôture de cette ressource en fin d'exécution)
    • Je ne vois pas comment tu gères l'intégrité référentielle entre les tables Joueur et Club
    • Les fonctions mysql_xxx sont obsolètes et ont été supprimées de PHP, tu dois passer par mysqli_xxx ou PDO

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 110
    Points : 57
    Points
    57
    Par défaut
    Salut Rawsrc,

    Merci pour ta réponse, je vais sortir la connexion de la boucle.
    Pour Mysql, il faudra que je procède en effet à une mise à jour, je repousse étant un bricolo du code, j'ai l'impression que le chantier va être compliqué (peut-être à tord).

    Entre les deux INSERT, j'utilise une fonction... obsolète : $id_joueur_recupere = mysql_insert_id(); que je déclare dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ajout2 = $sql->query("INSERT INTO "._TCLUB_." VALUES(
    Ainsi j'ai bien les mêmes ID qu'on retrouve dans la table "joueurs" et dans "club" (je ne l'avais pas mentionnée puisque ça fonctionne).

    Voici l'aperçu synthétisé de la page. (Le nombre de joueurs à créer peut varier grâce un ajout de champs)
    Nom : ap4.png
Affichages : 146
Taille : 7,9 Ko
    Voici un petit aperçu de phpmyadmin :
    Nom : ap1.png
Affichages : 137
Taille : 6,6 Ko
    Ce que j'obtiens :
    Nom : ap3.png
Affichages : 137
Taille : 4,6 Ko
    Ce que je souhaiterais :
    Nom : ap2.png
Affichages : 150
Taille : 4,8 Ko

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu ne sécurises jamais tes données avant de les enregistrer en base ?
    Poste le code complet de ton script, ça va être plus simple

  5. #5
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Pas sûr d'avoir bien compris.

    Est-ce que valeur 125 est prise dans un des tableaux utilisés dans la boucle for ? Si oui tu fais la même boucle for avant celle qui existe actuellement, tu sauvegardes la valeur <> 0 dans une variable que tu utilises dans le second for pour remplir le champ.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 110
    Points : 57
    Points
    57
    Par défaut
    L'idée serait donc bien de sauvegarder le club (sous forme d'ID ( ex : 125 ci dessus)) et de l'insérer dans chaque ligne de la table CLUB en fonction du nombre de ligne de la table JOUEURS.
    Voici le code PHP et HTML:

    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
    $nom_joueur = $_POST["nom_joueur"];
    $prenom_joueur = $_POST["prenom_joueur"];
    $Jclub = $_POST["club"];
     
    $totalNom = sizeof($nom_joueur);
     
    $sql->DatabaseConnexion();
     
    for($i=0;$i<$totalNom;$i++) {
     
    	$ajout = $sql->query("INSERT INTO "._TJOUEURS_." VALUES(
    						'',
    						'".$nom_joueur[$i]."',
    						'".$prenom_joueur[$i]."'
    						)") or die(mysql_error());	
     
    	$id_joueur_recupere = mysql_insert_id();
     
    	$ajout2 = $sql->query("INSERT INTO "._TCLUB_." VALUES(
    						'',
    						'".$id_joueur_recupere."',
    						'".$Jclub[$i]."'
    						)") or die(mysql_error());						
     
     
    }
    $sql->DatabaseClose();
    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
     
    <button class="add">Ajouter un joueur</button>
    <button class="remove">Supprimer le dernier joueur</button>
    <!-- CODE JS ajout des champs -->
    <form action="" method="post" enctype="multipart/form-data" name="add_joueurs" id="form_add_joueurs">
    			<p><input name="nom_joueur[]" id="nom_joueur" type="text" placeholder="Nom" /></p>
    			<p><input name="prenom_joueur[]" id="prenom_joueur" type="text" placeholder="Prénom" /></p>
    			<p><select name="club[]" id="club">
                            <option value="" selected="selected">Sélectionnez un club</option>
                            <!-- BEGIN clubs -->
                            <option value="{clubs.ID}">{clubs.NOM_CLUB}</option>
                            <!-- END clubs -->
                            </select></p>
    			<button type="submit">Valider</button>
    </form>

  7. #7
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Comme ça ?

    La combinaison de code orienté objet avec du code procédural pour les accès à la BDD est perturbant intellectuellement parlant. Ca donne l'idée de quelque chose qui n'est pas abouti et/ou maîtrisé.

    Code php : 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
    $nom_joueur = $_POST["nom_joueur"];
    $prenom_joueur = $_POST["prenom_joueur"];
    $Jclub = $_POST["club"];
     
    $totalNom = sizeof($nom_joueur);
     
    $sql->DatabaseConnexion();
    
    
    $identifiant = 0;
    for($i=0;$i<$totalNom;$i++) {
       if ($Jclub[$i] != 0) {
          $identifiant = $Jclub[$i];
          break;
       }
    }
    
    for($i=0;$i<$totalNom;$i++) {
     
    	$ajout = $sql->query("INSERT INTO "._TJOUEURS_." VALUES(
    						'',
    						'".$nom_joueur[$i]."',
    						'".$prenom_joueur[$i]."'
    						)") or die(mysql_error());	
     
    	$id_joueur_recupere = mysql_insert_id();
     
    	$ajout2 = $sql->query("INSERT INTO "._TCLUB_." VALUES(
    						'',
    						'".$id_joueur_recupere."',
    						'".$identifiant."'
    						)") or die(mysql_error());						
     
     
    }
    $sql->DatabaseClose();
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    quelque chose dans ce genre :
    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
    // il faut t'assurer de l'existence de ce que tu manipules, rien n'est moins sûr que ce qui provient d'internet
    $noms    = isset($_POST['noms'])    && is_array($_POST['noms'])    ? $_POST['noms']      : false;
    $prenoms = isset($_POST['prenoms']) && is_array($_POST['prenoms']) ? $_POST['prenoms']   : false;
    $club    = isset($_POST['club'])                                   ? (int)$_POST['club'] : false;
     
    if (empty($noms) || empty($prenoms) || empty($club)) {
        echo 'Données invalides, enregistrement impossible';    // tu peux gérer de manière personnalisée
        exit;
    } elseif (count($noms) !== count($prenoms)) {
        echo 'Le nombre de noms et prénoms ne correspond pas';
        exit;
    }
     
    // on s'assure qu'un petit malin n'aurait pas remplacé les clés numériques attendues par une alphanumérique
    $noms    = array_values($noms);
    $prenoms = array_values($prenoms);
     
    $sql->DatabaseConnexion();
    $joueurs = [];
     
    // on enrergistre d'abord tous les joueurs individuellement, on récupère leur id dans le tableau $joueurs
    foreach ($noms as $k => $nom) {
        $sql_str   = 'INSERT INTO '._TJOUEURS_.' VALUES ("'.mysql_real_escape_string($nom).'", "'.mysql_real_escape_string($prenoms[$k]).'"';
        $exec      = $sql->query($sql_str) or die("Erreur d'enregistrement des joueurs en base de données"); // tu ne sors jamais les erreurs serveur sur la page du client
        $joueurs[] = mysql_insert_id();
    }
     
    // on génère le sql pour le club en une seul fois : à ce stade on est absolument certain
    // que l'id du joueur est numérique et l'id du club aussi donc pas besoin d'échapper les données
    // on va utiliser la syntaxe SQL pour l'insertion multiple : VALUES (a, b), (c, d), (e, f)...
    $values = [];
    foreach ($joueurs as $j) {
        $values[] = "({$j}, {$club})";
    }
    $sql_str = 'INSERT INTO '._TCLUB_.' VALUES '.implode(', ', $values);
    $sql->query($sql_str) or die("Erreur d'enregistrement des clubs en base de données");
    Pense à abandonner, dès aujourd'hui même, les fonctions mysql_En passant à PDO, tu unifieras le code entre syntaxe objet et procédurale

    PS : fait attention, j'ai renommé tes <input ...> en plus court, regarde bien mes variables $_POST

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 110
    Points : 57
    Points
    57
    Par défaut
    Ça fonctionne !
    Merci Badaze et Rawsrc pour votre aide !

    Je vais regarder pour me mettre à jour, je suis un bricolo du code donc pas mal de choses sont abstraites mais je vais m'y pencher.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/12/2017, 17h54
  2. Réponses: 18
    Dernier message: 02/03/2015, 00h40
  3. Réponses: 2
    Dernier message: 14/03/2014, 09h15
  4. Afficher des valeurs en fonction des données d'un champ
    Par Tchouk01 dans le forum VBA Access
    Réponses: 0
    Dernier message: 02/04/2008, 14h24
  5. [MySQL] Boucle : répétition des valeurs précédentes
    Par mioke dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/03/2008, 17h38

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