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

Langage PHP Discussion :

Enregistrement d'un formulaire créé à partir de données extraites d'une base de données


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Enregistrement d'un formulaire créé à partir de données extraites d'une base de données
    Bonjour à tous,

    Je me tourne vers vous car j'ai un "bug mental" concernant une action que je dois faire: je ne sais absolument pas par où prendre ce problème.
    Je vous explique mon cas:

    En fait j'ai créé différentes fiches produits qui sont stockées dans une BDD.
    J'aimerai relier ses fiches produits dans des packs avec la possibilité de mettre chacun des produits en "inclus","optionnel","sur devis", ...

    A l'heure actuelle, tout est créé :
    • Bdd produit
    • Bdd pack
    • Bdd presence
    • Bdd lien_pack_produit (idPack, idProduit, idPresence)


    J'arrive également à afficher l'ensemble de mes produits ainsi que la liste des présences disponibles par produit.

    Mon bug arrive donc là : comment faire pour enregistrer les différents éléments dans ma BDD lien_pack_produit étant donné que tout est généré dynamiquement?

    Voici le code de création de mon formulaire
    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
     
    <form method="post" name="fDonnees" action="validFicheSite.php">
    <input type="hidden" name="idSite" id="idSite" value="<?php echo $veidSit ?>"/>
    <?php
    include("../Connections/connect_admin.php");
    $reqres=mysql_query("SELECT packreferencement.idRef, packreferencement.nomRef FROM packreferencement ORDER BY packreferencement.nomRef DESC ");
    $reqresu=mysql_query("SELECT presence.idPresence, presence.termePresence FROM presence ORDER BY presence.termePresence DESC ");
     $nbenr=mysql_num_rows($reqres);
     $nbenre=mysql_num_rows($reqresu);
     
      if ($nbenr!=0 && $nbenre!=0) {
    	  while ($a_row = mysql_fetch_array($reqres)){
    		  echo "<label style='width:200px'>".$a_row["nomRef"]."</label>";
    		  echo "<input type='hidden' name='ref.".$a_row["idRef"]."' id='ref.".$a_row["idRef"]."' value='".$a_row["idRef"]."'/>";
    		  echo "<select id='pres.".$a_row["idRef"]."' name=pres.".$a_row["idRef"].">";  
    		  $reqresu=mysql_query("SELECT presence.idPresence, presence.termePresence FROM presence ORDER BY presence.termePresence DESC ");
    		  while ($a_row = mysql_fetch_array($reqresu)) {
    			  echo "<option value='".$a_row["idPresence"]."'>".$a_row["termePresence"]."</option>";
    		  }
    		echo "</select> <hr/>";
    	  }
      mysql_close($connect_admin);
     }?>
     
    </form>

    Auriez vous une idée de comment récupérer l'ensemble des informations disponibles dans ce formulaire (et donc la création du fichier validFicheSite.php) pour une insertion dans la BDD lien_pack_Site?

    D'avance merci pour vos réponses

    Ps: $veidSit est récupéré par un GET donc c'est également géré

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour.

    A ce que j'ai compris, ton formulaire contient un nombre indéterminé de champs et tu souhaites les entrer en base c'est ca ?

    Dans tout les cas, tes champs sont listés dans le tableau $_POST, il faut que tu le parcours via une boucle

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    C'est tout à fait ce que j'ai voulu expliquer en effet

    Par contre, autant j'avais compris ce que je devais faire, autant je n'arrive pas à le reformuler en "code" et c'est là que je "bug"

    Si vous aviez tout au moins un démarrage de code pour ce genre de chose, ca m'arrangerait

    D'avance merci

  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Dans ta page de traitement de formulaire (validFicheSite.php) mets tout en commentaire et marque ceci :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';

    Tu verras comment sont formatés tes données

    Reste ensuite à le parcourir via une boucle foreach par exemple

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($_POST as $key=>$value){
    ...
    }

    Sans oublier bien sur d'effectuer les tests de sécurité nécessaires avant insertion en base

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Ok merci

    Je tenterai ça ce soir et je reviendrais pour dire ce qu'il en est

    Encore merci

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Un grand merci Madfrix.
    Grâce à tes idées, j'ai pu élaborer (presque) l'intégralité de mon code

    Pour les personnes intéressées par la solution, voici le code créé :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <?php
    $idRef ="";
    $idPres ="";
    $idProd ="";
    $idSit = $_POST["idSite"];
    if (is_numeric($idSit)) {
    	include('../Connections/connect_admin.php');
    	$reqres=mysql_query("SELECT * FROM lien_pack_referencement WHERE idPack='".$idSit."'");
    	$nbenr=mysql_num_rows($reqres);
    	if ($nbenr==0){
    		//On est mode ajout
    		foreach( $_POST as $key => $value ) {
    		  if (substr($key,0,3) == "ref"){
    			  $idRef = $value;
    		  }
    		  if (substr($key,0,4) == "pres") {
    			  $idPres = $value;
    		  }
    		  if (is_numeric($idRef) && is_numeric($idPres)) {
    			  $reqres=mysql_query("INSERT INTO lien_pack_referencement VALUES ('".mysql_real_escape_string($idSit)."','".mysql_real_escape_string($idRef)."','".mysql_real_escape_string($idPres)."')");
    			  $idRef ="";
    			  $idPres ="";
    		   } 
    		}
    	} else {
    		//On est en mode modification
    		  foreach( $_POST as $key => $value ) {
    		  if (substr($key,0,3) == "ref"){
    			  $idRef = $value;
    		  }
    		  if (substr($key,0,4) == "pres") {
    			  $idPres = $value;
    		  }
    		  if (is_numeric($idRef) && is_numeric($idPres)) {
    			  $reqres=mysql_query("UPDATE lien_pack_referencement SET idPresence='".mysql_real_escape_string($idPres)."' WHERE idPack='".$idSit."' AND idRef ='".$idRef."'");
    			  $idRef ="";
    			  $idPres ="";
    		   } 
    		}
    	}
    	$reqres=mysql_query("SELECT * FROM lien_pack_produit WHERE idPack='".$idSit."'");
    	$nbenr=mysql_num_rows($reqres);
    	if ($nbenr==0){
    		//On est mode ajout
    		foreach( $_POST as $key => $value ) {
    		if (substr($key,0,4) == "prod"){
    			$idProd = $value;
    		}
    		if (substr($key,0,5) == "pProd") {
    			$idPres = $value;
    		}
    		if (is_numeric($idProd) && is_numeric($idPres)) {
    			  $reqres=mysql_query("INSERT INTO lien_pack_produit VALUES ('".mysql_real_escape_string($idSit)."','".mysql_real_escape_string($idProd)."','".mysql_real_escape_string($idPres)."')");
    			  $idProd ="";
    			  $idPres ="";
    		   } 
    		}
    	} else {
    		//On est en mode modification
    		  foreach( $_POST as $key => $value ) {
    		  if (substr($key,0,4) == "prod"){
    			  $idProd = $value;
    		  }
    		  if (substr($key,0,5) == "pProd") {
    			  $idPres = $value;
    		  }
    		  if (is_numeric($idProd) && is_numeric($idPres)) {
    			  $reqres=mysql_query("UPDATE lien_pack_produit SET idPresence='".mysql_real_escape_string($idPres)."' WHERE idPack='".$idSit."' AND idProd ='".$idProd."'");
    			  $idProd ="";
    			  $idPres ="";
    		   } 
    		}
    	}
    	mysql_close($connect_admin);
    } 
    ?>

    Par contre, un autre problème me vient à l'idée.
    En effet, là je peux insérer (si je n'ai pas de lignes correspondante à ma première requête [if ($nbenr==0)]) ou modifier les lignes existantes si mon formulaire créé ne contient pas de champs supplémentaires.

    Mais comment faire si mon formulaire comporte 1 (ou plusieurs) nouveaux champs ?
    Comment faire pour comparer les id présents dans mon formulaire avec ceux présents dans ma base ?

    J'avais pensé faire une comparaison entre le nombre de ligne présent dans le formulaire avec le nombre dans ma BDD mais ça ne me permet pas de vérifier totalement les id présents ==> mauvaise idée

    Quelqu'un peut il me donner une voie pour améliorer le code que je viens de mettre pour qu'il puisse prendre en compte l'ajout d'une ligne dans le formulaire ?

    D'avance merci pour vos réponses (et encore une fois merci à Madfrix)

  7. #7
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Je suis pas sur d'avoir saisi parfaitement la problématique mais pourquoi par exemple générer des name en fonction des filtres à appliquer de la sorte filtre1_filtre2_filtren_name ?

    Ex: je veux un champs qui doit être numérique et de longueur > 6 je le nomme num_sup6_nomChamps ainsi après un split sur le _ je sais tout de suite quelle fonction appliquer à mon champs.


    PS: faire ceci pour calculer le nombre de ligne est une très mauvaise idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $reqres=mysql_query("SELECT * FROM lien_pack_referencement WHERE idPack='".$idSit."'");
    $nbenr=mysql_num_rows($reqres);
    Privilégier amplement le count() SQL

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    En quoi le "mysql_num_rows" est une très mauvaise idée ??

    Sinon concernant ma problématique, j'dois avouer que je n'ai pas bien saisi ton dernier post.

    Comme expliqué avant, mon formulaire est créé en fonction de données insérées dans 2 BDD différentes.
    A un instant T il y a donc x entrées dans la BDD1 et y entrées dans la BDD2.
    Le formulaire reprend donc les x et y entrées et je les enregistre dans une autre BDD3.

    Si à un instant T+1 je décide de rajouter une nouvelle entrée dans la BDD1 (par exemple) j'aurai donc : x+1 entrées de la BDD1 et y entrées de la BDD2 dans mon formulaire.

    Ma problématique est que je veux rentrer dans ma BBD3 la nouvelle entrée rentrée dans la BDD1 via ce même formulaire.

    Donc je suppose que dans ma requête de mise à jour de la BDD3, je dois vérifier les id rentrés et vérifier chacun des id de la BDD3 avec les id générés par mon formulaire. Mais encore une fois : Quid du code pour faire ce genre de comparaison

  9. #9
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par PeGaZe33 Voir le message
    En quoi le "mysql_num_rows" est une très mauvaise idée ??
    Ce sera beaucoup plus rapide par le count qui fera l'opération directement sur le serveur alors que toi tu ramènes tous les enregistrements du serveur pour effectuer une opération que MySQL fait nativement. Bien sur sur une petite table l'impact sera moindre mais plus elle sera grosse et plus l'impact se fera sentir.

    Pour t'en convaincre, essaie de voir combien de temps dure chaque méthode :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $debut = microtime(true);
    // ici les requetes via mysql_num_rows puis via le count SQL
    $fin = microtime(true);
     
    echo 'temps de traitement : '. ($fin-$debut);


    Sinon pour vérifier les id en table, tu peux faire une requête de sélection sur tes ids, les mettre dans un tableau et tester si ton id actuel est dans le tableau. Si non, alors tu l'insères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $id = array(...); // tableau contenant les id à traiter
    $id_base = array(); // tableau destiné à recevoir les id de la base
    $query = 'SELECT id FROM bdd3';
    $resultat = mysql_query($query);
     
    while($ligne = mysql_fetch_array($resultat))
          $id_base[] = $ligne[0];
     
    foreach($id as $valeur)
          if(!in_array($valeur, $id_base))
                 // insertion en base ici

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/04/2008, 18h34
  2. Réponses: 1
    Dernier message: 10/10/2007, 10h42
  3. [Conception] formulaire et case à cocher et recherche dans une base de donnée
    Par olivier_1970 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/06/2006, 01h03
  4. Réponses: 21
    Dernier message: 05/06/2006, 10h49
  5. [base de données]partage d'une base de données
    Par Scrusher dans le forum JDBC
    Réponses: 4
    Dernier message: 02/06/2004, 13h33

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