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 :

Formulaire dynamique pour plusieurs tables (INSERT INTO) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut Formulaire dynamique pour plusieurs tables (INSERT INTO)
    Bonjour à tous

    Voici mon problème , j'ai crée un seul est unique formulaire pour plusieur table qu'on choisis sur une liste déroulante
    voici le code du formulaire :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
    /**********************************************************
      Selection de la table via un menu déroulant
      *********************************************************/
    $sql = "SHOW TABLES FROM repair";
    $result = mysql_query($sql);
     
    if (!$result) {
       echo "Erreur DB, impossible de lister les tables\n";
       echo 'Erreur MySQL : ' . mysql_error();
       exit;
    }
     
    ?>
     
     
    <form method="post" action= "maj.php">
        <select name="choix";>
    <?php
    while ($row = mysql_fetch_row($result)) {
       echo '<option value="' .$row[0] .'" name="table">'.$row[0] . '</option>';
    }
    mysql_free_result($result);
    echo '<br><br><br>';
     
     
    ?>
        </select>
        <td><input type="submit" name="valider" value="valider"></td>
    </form>
            <br>
     
     <?php if (isset ($_POST["valider"])) {
     $choix = $_POST['choix'];
    $_SESSION['choix']=$choix;
        ?>
    <fieldset><legend>Formulaire ajout</legend>
      <form name="loadByForm" method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
        <table id="textleft">
            <?php   
        $req="SHOW COLUMNS FROM $choix";
        $result2 = mysql_query($req);$valeur=0;$i=0;
        while ($row2 = mysql_fetch_row($result2)) { $i++;
            ?>
            <td id="titrerow"><?php echo "$row2[0]" ?> </td>
            <td id="modif"><input type="text" size="15" name= <?php "$valeur[$i]" ?> value="<?php echo "$row2[0]";?>"> </td>
          <tr><?php    }?>
            <td></td><td colspan="2"><input type="reset" name="btnRstForm" value="effacer"></td>                     
            <td><input type="submit" name="btnLoadByForm" value="enregistrer"></td>                      
        </tr></table>
      </form> 
    </fieldset>
      <?php

    Et je veux récupérer les valeur pour les insérer dans la base de donnée avec un INSERT INTO

    Voici le code ;

    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
    <?php
    /**********************************************************
      Insertion d'une carte dans la base de données
      *********************************************************/
    echo"<h3>Insertion dans la base de données</h3>"; 
    if (isset ($_POST["btnLoadByForm"])) {// page appelée par le formulaire "loadByForm"       
    extract($_POST);  $choix=$_SESSION['choix'];$req="SHOW COLUMNS FROM $choix";
        $result2 = mysql_query($req);
     
        // Test si la pièce a déja été enregistrée dans la base de données
        $req = "SELECT '$valeur[0]' FROM $choix WHERE $choix.nom='$valeur[0]'";
        $result = mysql_query($req)
          or die ("Accès à la liste des pièces impossible".mysql_error());
     
        if (mysql_num_rows($result) != 0) //pièce déjà enregistrée
          echo "<p id='warning'>La pièce a déjà été enregistrée dans la base de données !!</p>";
        else { // Nouvelle pièce => enregistrement
     
           $sql = "insert into ".$choix." values(";
     
     while ($valeur = mysql_fetch_array($result2)) {
     
    $i++;
    echo $valeur[$i];
     
        $sql .= '"'.$valeur[$i].'")';
        echo $sql;
          $result = mysql_query($sql)
            or die ("Accès à la base de données impossible".mysql_error());
          echo"<p id='ok'>Les données ont été enregistrées avec succès!!</p>";
    } } }
     
      ?>
    cela me donne : insert into cartes values ("varchar(50)")"YES")

    Le problème c'est que j'arrive pas à récupérer les valeurs dans le formulaire

    Le formulaire de la table cartes est sous la forme : voir PJ

    Merci à tous
    Images attachées Images attachées  

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Je vais vous remontrer le code en mieux présenter :

    Voici le code de la liste déroulante de toutes les tables :

    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
    <?php
    /**********************************************************
      Selection de la table via un menu déroulant 
      *********************************************************/
    $sql = "SHOW TABLES FROM repair";
    $result = mysql_query($sql);
     
    if (!$result) {
       echo "Erreur DB, impossible de lister les tables\n";
       echo 'Erreur MySQL : ' . mysql_error();
       exit;
    }
    ?>
     
     
    <form method="post" action= "maj.php">
    	<select name="choix";>
    <?php 
      while ($row = mysql_fetch_row($result)) 
      {
         echo '<option value="' .$row[0] .'" name="table">'.$row[0] . '</option>';
      }
        mysql_free_result($result);
       echo '<br><br><br>';
    ?> 
    	</select>
    	<td><input type="submit" name="valider" value="valider"></td>	
    </form>
    <br>

    Voici la partie Formulaire qui changent en fonction du nombre de colonne de la table et qui affiche le nom des colonnes à chaque champs

    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
     <?php if (isset ($_POST["valider"])) {
     $choix = $_POST['choix'];
     $_SESSION['choix']=$choix;
     ?>
    <fieldset><legend>Formulaire ajout</legend>
      <form name="loadByForm" method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
        <table id="textleft">
    		<?php 	
    	          $req="SHOW COLUMNS FROM $choix";
    	          $result2 = mysql_query($req);$valeur=0;$i=0;
    	           while ($row2 = mysql_fetch_row($result2)) {	
             ?>
    		           <td id="titrerow"><?php echo $row2[0] ?> </td>
                       <td id="modif"><input type="text" size="15" name= <?php "$valeur[$i]";?> value="<?php echo $row2[0] ;?>"> </td> 
                       <tr><?php  $i++;  }?>
            <td></td><td colspan="2"><input type="reset" name="btnRstForm" value="effacer"></td>						
            <td><input type="submit" name="btnLoadByForm" value="enregistrer"></td>						
        </tr></table>
      </form>  
    </fieldset>
      <?php
      }
    Et maintenant voici la parti du code pour insérer les valeurs dans la base :

    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
    <?php   
     
    /**********************************************************
      Insertion d'une carte dans la base de données
      *********************************************************/
    echo"<h3>Insertion dans la base de données</h3>";  
    if (isset ($_POST["btnLoadByForm"])) {// page appelée par le formulaire "loadByForm"    	
      extract($_POST);  
      $choix=$_SESSION['choix'];
      $req="SHOW COLUMNS FROM $choix";
      $result2 = mysql_query($req);
     
        // Test si la pièce a déja été enregistrée dans la base de données
        $req = "SELECT * FROM $choix WHERE $choix.nom='$valeur[0]'"; 
        $result = mysql_query($req) 
          or die ("Accès à la liste des pièces impossible".mysql_error());
     
        if (mysql_num_rows($result) != 0) //pièce déjà enregistrée
          echo "<p id='warning'>La pièce a déjà été enregistrée dans la base de données !!</p>";
        else { // Nouvelle pièce => enregistrement
     
    	$sql= "insert into ".$choix." values(";
    	while ($valeur = mysql_fetch_array($result2)) {  
     
    	$sql .= '"'.$valeur[$i].'",';
    	$i++;
        }
    	$sql .= ')';
    	echo $sql;
          $result = mysql_query($sql) 
          or die ("Accès à la base de données impossible".mysql_error());
     
          echo"<p id='ok'>Les données ont été enregistrées avec succès!!</p>";
    } } 
      ?>
    Le problème est que j'arrive pas à récuperer les valeurs dans le champs , la requete que j'ai en ce moment est :
    insert into cartes values ("varchar(50)")"YES")

    Merci

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Dans la deuxième partie tu as un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $valeur = 0;
    $i = 0;
    while ($row2 = mysql_fetch_row($result2)) {
    ?>
    <td id="titrerow"><?php echo $row2[0] ?> </td>
    <td id="modif"><input type="text" size="15" name= <?php "$valeur[$i]"; ?> value="<?php echo $row2[0]; ?>"> </td> 
    <tr>
    Tu assignes la valeur "0" à "valeur" puis tu agis comme si c'était un tableau ensuite. Tu n'as pas de "echo" également sur le name, et tu as un problème de guillemet au même endroit. Et il y a probablement d'autres erreurs ailleurs. Debug ton code HTMl avec la console (touche F12 sous chorme, extension firebug sous firefox).

    Deux remarques au passage : ton code n'est absolument pas sécurisé, et l'extension Mysql est déprécié, il faut dès à présent utiliser l'extension Mysqli qui lui est très similaire, ou encore mieux, PDO.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Merci pour tes conseils
    Mais quelle est la façon pour que mon tableau renvoie les valeurs inscrites de mes champs?
    et de les insérer dans une requête ?

    Pour la sécurité je sais , je le met au dernier moment

    Merci

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Comme tu as fait, tu es sur la bonne piste, tu as juste fait des erreurs de syntaxe. Corrige les comme je te l'ai indiqué.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    J'ai changé de méthode , voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql= "insert into ".$choix." values(";
     
     
           foreach($_POST  AS $field => $value) {
    			if ($value!='enregistrer')
    		       $sql .= '"'.$value.'",';
     } 
    $sql .= ")";
    $sql = str_replace(strrchr($sql,'",)'),'")',$sql);
    Merci beaucoup à toi Spartacusply

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu ne dois jamais mais alors absolument jamais faire confiance aux données reçues d'un utilisateur.
    Tu attaques ton tableau $_POST directement, tu en extrais les valeurs que tu injectes aussi sec dans le SQL !

    Tu dois t'assurer que la valeur de $choix correspond à une des valeurs possibles, puis tu dois, penser à échapper $value avant de monter ton SQL.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    salut rawsrc

    Pour le $choix , l'utilisateur n'a pas le choix car on selectionne $choix dans une liste déroulante , donc c'est bon.

    Concernant les $values , je comprends pas ce que tu veux dire en parlant de "echaper"

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par kemepe Voir le message
    on selectionne $choix dans une liste déroulante , donc c'est bon.
    Non, non c'est pas du tout bon.
    Les données reçues d'un formulaire (quelque soit le contrôle utilisé) sont entièrement trafiquables, pour t'en convaincre, sous FireFox, installe et active le module complémentaire "Tamper Data".
    Ce petit truc, te permet de trafiquer absolument tout ce qui sort de ton navigateur...

    Pour échapper des données, c'est fonction de la manière utilisée pour attaquer la base : mysql, mysqli, PDO...
    C'est une question tellement récurrente que je ne vais pas répéter pour la millionième fois la réponse, tu trouveras tout ce qu'il faut sur ce site et dans la doc de PHP.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Merci beaucoup pour votre prévention

    auriez-vous un lien ou deux pour voir ces fonctions de sécurité s'il vous plait?

  11. #11
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Dans ton cas, il faudrait relancer la requête SHOW TABLES FROM repair, puis récupérer le résultat dans une variable $tables par exemple et vérifier comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ((( ! empty($_POST['choix'])) && in_array($_POST['choix'], $tables, true)) 
    { 
        // ok 
    } 
    else 
    { 
        // choix invalide
     }
    Après je pense qu'il n'est pas très judicieux de sortir les noms des tables de la base de données dans un formulaire... Faut voir quel usage il en sera fait par la suite et par qui...

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Cela permet d'ajouter directement une carte ou documentation ;
    c'est dans le cadre d'une entreprise d'électronique dans le service réparation

    La personne à juste à choisir une table, cela affiche le formulaire avec les champs de la table venant de la base , puis il écrit dans les champs ce qu'il veut ajouter

    simple et efficace non?

    et pas besoin de faire 50 formulaire pour chaque tables différentes

    J'espere que vous avez compris ce que je veux faire
    Merci encore pour vos infos

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

Discussions similaires

  1. [MySQL] Formulaire pour plusieurs tables
    Par Dark Neggror dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/05/2009, 17h53
  2. Réponses: 1
    Dernier message: 20/06/2007, 03h18
  3. Réponses: 2
    Dernier message: 09/08/2006, 22h04
  4. sous-formulaire : champs provenant plusieurs tables
    Par patbeautifulday1 dans le forum IHM
    Réponses: 13
    Dernier message: 21/12/2005, 11h17
  5. [ Design ] commentaires pour plusieurs tables
    Par Celelibi dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 31/10/2005, 18h08

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