1. #1
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut Formulaire dynamique à champs variables suivant le nombre de colonnes de la table

    Bonjour.

    Est-il possible de créer un formulaire dont le nombre de champ est variable suivant le nombre de colonnes de la table.

    Si la table contient les colonnes id, nom, prenom, adresse, cp et telephone.

    Comment éviter de d'écrire les lignes du formulaire suivantes :
    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
    <form name="insertion" action="#" method="POST">
    <table border="0" align="center" cellspacing="2" cellpadding="2">
    		<tr align="right">
    			<td>Nom</td>
    			<td align="left"><input type="text" name="nom"></td>
    		</tr>
    		<tr align="right">
    			<td>Prenom</td>
    			<td align="left"><input type="text" name="prenom"></td>
    		</tr>
    		<tr align="right">
    			<td>Adresse</td>
    			<td align="left"><input type="text" name="adresse"></td>
    		</tr>
    		<tr align="right">
    			<td>Code postal</td>
    			<td align="left"><input type="text" name="cp"></td>
    		</tr>
    		<tr align="right">
    			<td>Téléphone</td>
    			<td align="left"><input type="text" name="telephone"></td>
    		</tr>
    		<tr align="center">
    			<td colspan="2">Saisir les données  <input "type="submit" value="Enregistrer"></td>			
    		</tr>
    	</table>
    </form>
    Bien sûr pour un petit nombre de colonnes cela ne présente aucuns intérêts.

    Mais pour un grand nombre de colonnes, les name en dur peuvent-t-ils être remplacés par une variable dans un boucle ?

    J'ai un petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Récupération des noms des colonnes de la base
    $req = $bdd->query("describe personnes");
     
    $form = '<form name="" action="" method="post">'."\n";
     
    while($row = $req->fetch(PDO::FETCH_NUM)){
    	 $form .= '<input name="Name[]" type="text" value="'.$row[0].'"><br>'."\n";
    }
     
    $form .= '</form>'."\n";
     
    echo $form;
    Mais là je sèche pour la suite, un petit coup de pouce svp.

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    Je ne comprends pas bien ta question.

    Tu écrits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $form .= '<input name="Name[]" type="text" value="'.$row[0].'"><br>'."\n";
    Pour avoir un name qui correspond à au nom du champ tu y étais presque. Cependant il ne faut pas que value soit égal au nom du champ. Ca n'a pas de sens.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $form .= '<input name="'.$row[0].'" type="text" value="'.$row[0].'"><br>'."\n";
    Si tu veux avoir la liste des champs et des valeurs d'un ou de plusieurs enregistrements tu peux faire comme suit.

    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
     
    <?php
     $bdd    = 'tests';  
     $table  = 'category_user';
     
     $pdo    = new PDO("mysql:host=127.0.0.1; dbname=$bdd;charset=UTF8","root","", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
     
     //------ On prend le nom et le commentaire des colonnes
     $query  = "SELECT COLUMN_NAME, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='$bdd' AND table_name='$table'";
     $sth    = $pdo->prepare($query); 
     $sth->execute(); 
     $arrayCol = array();
     while($row=$sth->fetch()) {
     $arrayCol[$row[0]] = $row[1];
     }
     
     //----- Lecture d'un seul enregistrement pour les besoins de l'exemple
     $query  = "select * from $table limit 0,1";
     $sth    = $pdo->prepare($query); 
     $sth->execute();?>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    </head>
    <body>
    <form action="ma_page.php" method="post">
     <table><?php
     while($row=$sth->fetch()) {
      foreach($arrayCol as $key => $value) {
       $name        = $key;
       $commentaire = $value != "" ? $value : $key;
       $valeur      = $row[$key];?>
       <tr>
       <td>
        <?php print $commentaire;?></td>
       <td>
        <input type="text" name="<?php print $name;?>" value="<?php print $valeur;?>"/>
       </td>
       </tr>
      <?php
      }
     }?>
     </table>
     <input type="submit" name="btn_valider" value="Valider" />
    </form>
    </body>
    </html>

    Donne à l'écran :
    Nom : 20170518_001.JPG
Affichages : 119
Taille : 16,6 Ko

    HTML généré :
    Nom : 20170518_003.JPG
Affichages : 123
Taille : 65,6 Ko
    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.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut

    Bonjour badase

    Navré de répondre aussi tardivement j'ai eu un gros contre temps.

    Ceux-ci dit, merci mille fois pour avoir consacré une partie de votre temps à ma question et pour votre réponse.

    J'ai presque tout compris, sauf un petit truc qui fonctionne pas lors de l'envoi dans la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="ajout_adherent.php" method="post">page
    Voici la suite de mon
    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		
    	//connection au serveur:
    	include'connect_infos_0.php';
     
    	// récupération des variables POST: 
    	$nom=isset($_POST['nom'])?$_POST['nom']:'';
    	$prenom=isset($_POST['prenom'])?$_POST['prenom']:'';
    	$adresse=isset($_POST['adresse'])?$_POST['adresse']:'';
    	$cp=isset($_POST['cp'])?$_POST['cp']:'';
    	$tel=isset($_POST['telephone'])?$_POST['telephone']:'';
     
    	error_reporting(E_ALL);
    	if(empty($nom)){
    		//Requete d'ajout
    		echo 'L\'insertion a échouée le champ [$nom] est obligatoire.<br />';
    	}
    	else {
    		$sql='INSERT INTO personnes(nom,prenom,adresse,cp,telephone) VALUES (:nom,:prenom,:adresse,:cp,:telephone)';
    		$insert_a = $bdd->prepare($sql);
    		$insert_a->execute(array('nom'=>$nom,'prenom'=>$prenom,'adresse'=>$adresse,'cp'=>$cp,'telephone'=>$tel));
     
    		//affichage des résultats, pour savoir si l'insertion a marchée:
    		echo("L'insertion a été correctement effectuée") ;
    	}
    ?>
    Ça doit être une petite erreur certainement un problème de nom de variable ?

    Pourriez-vous confirmer svp.

  4. #4
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    Il manque le code du formulaire.
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut

    Bonjour badase.

    En fait le formulaire (votre code du post #2), je souhaite l'envoyer dans la même page pour enregistrer un nouveau adhérent dont le champ "nom" doit être obligatoirement rempli même si les autres champs sont vident.

    J'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="<?php print $name;?>" value="<?php print $valeur;?>"/>
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input style="width:267px;" type="text" name="<?php print $name;?>" value=""/>
    Voici la suite du code que je n'arrive pas à faire fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    error_reporting(E_ALL);
    if(empty())
    {
       echo 'L\'insertion a échouée le champ nom est obligatoire.<br />';
    }
    else
    {
    foreach($arrayCol as $champ)
    {
       $bdd->exec("INSERT INTO personnes('','".$champ."') VALUES('','".$champ."')");
    }
       echo("L'insertion a été correctement effectuée") ;
    }
    C'est certainement simple mais comment tester dans la condition si le "nom" est vide ?

    Encore merci pour votre réponse.

  6. #6
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    La syntaxe que tu utilises pour l'insert n'est pas la bonne.

    Exemple: champ1 et 2 sont numériques. champ3 et 4 sont alphanumériques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO table01 (champ1, champ2, champ3, champ4) VALUES (100, 110, 'texte1', 'texte2');
    De plus. Si tu délimites les chaînes de caractères avec des " tu peux mettre directement un nom de variable. => "bonjour $prenom" donnera le même résultat que "bonjour ".$prenom.

    Enfin. Je te conseille d'utiliser PDO prepare et PDO execute au lieu de PDO exec car dans ton cas si tu insères une variable alphanumérique => ".... values('$ma_variable')" il faut que tu fasses au minimum un addslashes de la variable afin de transformer les éventuels ' présents dans la variable en \' sans quoi ta requête plantera.
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut

    Bonjour.

    La base de données pour mon association fonctionne bien pour l'instant.

    D'où l'intérêt, si elle évolue d'utiliser un formulaire dynamique et je remercie badaze d'avoir apporté sa contribution et la solution.

    Je reviens sur cette discussion, car j'ai essayé à partir du formulaire d'insérer dynamiquement un nouvel enregistrement.

    Voilà mon code pour construire la chaîne de la requête préparée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php  
    if(isset($_POST['valider'])){
    	foreach($_POST as $index=>$valeur){
    		if ($index!='valider'){
    			if (empty($_POST['id'])) {echo $_POST['id'] ='NULL';} 
    				elseif (!empty($valeur)) {echo ',\''.$valeur.'\'';}
    				else {if(count($_POST)-1 && empty($valeur) || !empty($valeur)){echo ',\'\'';}
    			}
    		}
    	}
    }	
    ?>
    En sachant et en partant sur le même nombre de champ, en phase avec mon premier post :
    Le 1er champ "id" du formulaire est masqué
    Données entrées : "SAIS " dans le 2 ème champ "nom"
    Données entrées : "Jérôme" dans le 3 ème champ "prenom"
    Données entrées : "" dans le 4 ème champ "adresse"
    Données entrées : "" dans le 5 ème champ "cp"
    Données entrées : "" dans le 6 ème champ "telephone"

    Echo affiché : NULL, 'SAIS',' Jérôme','','',''

    Mais je ne sais pas comment l'intégré : ────────┐
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = ("INSERT INTO personnes VALUES(…)");
    $stmt=$bdd->exec($sql);
    Existe-t-il une solution plus simple ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut

    Bonjour.

    Je sollicite encore votre aide car je galère pour essayer à partir du formulaire dynamique de badaze d'insérer dynamiquement un nouvel enregistrement.

    Cette fois j'utilise un tableau pour faire une requête préparée, est-ce possible ?

    Voilà mon nouveau 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
    <?php 
    if(isset($_POST['valider'])){
    	$tableau1[] =  $_POST['id'] ='NULL';
    	foreach($_POST as $index=>$valeur){
    		if ($valeur != 'OK' && $index != 'id'){
    			$tableau2[] = ',\''.$valeur.'\''; 
    		} 				
    	}
    }
     
    $tabfusion=array_merge($tableau1,$tableau2);
    //var_dump($tabfusion);
     
    $sql = ('INSERT INTO personnes VALUES("$tabfusion")');
    $sql=$bdd->exec($sql);
    ?>
    Mais ça fonctionne pas est-ce la ligne "$sql = ('INSERT INTO personnes VALUES("$tabfusion")');"qui est pas bonne ?

    Un petit coup de pouce svp merci.

  9. #9
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    J'essaierai de jeter un coup d'oeil ce soir.
    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.

  10. #10
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    @modus57.

    Est-ce que tu as fait un débogage de base ? C'est-à-dire de faire des print des différentes valeurs.
    Là comme ça je vois déjà un pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tableau1[] =  $_POST['id'] ='NULL';
    n'a pas de sens. Sans compter le fait qu'un id ne peut être null.

    Donc déjà fait des sorties écran des différentes variables et tu y verras plus clair.

    De plus si tu veux faire quelque chose de dynamique il faut construire ton insert en fonction des champs de la table dans laquelle tu veux insérer.
    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.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut

    Bonjour badaze

    Heureux de te lire.

    Simple remarque sans aller plus loin, avec la requête préparée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = ("INSERT INTO personnes VALUES(NULL,'DUPONT','Marcel','','','')");
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = ("INSERT INTO personnes VALUES(0,'DUPONT','Marcel','','','')");
    $sql=$bdd->exec($sql);
    Ça fonctionne.

    Requête testée dans SQL phpMyAdmin.

  12. #12
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    Ce qui compte c'est voir ce que donne un print de $sql

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'INSERT INTO personnes VALUES("$tabfusion")';
    print $sql;
    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.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 485
    Points : 88
    Points
    88

    Par défaut

    Résultat print $sql;
    INSERT INTO personnes VALUES ("$tabfusion")
    Donc VALUES n'accepte pas de variable ?

    Par contre ceci fontionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $bdd->beginTransaction();
    $requete = $bdd->prepare('INSERT INTO personnes VALUES (?,?,?,?,?,?)');
    $requete->execute($tabfusion);
    $bdd->commit();
    Mais cela oblige de créer autant de ? que de champs de saisie dans le formulaire, mon but c'est de l'éviter et si VALUES n'accepte pas de variable je vois pas comment procéder.

    Toutefois s'il n'existe pas de solution, c'est simple d'écrire un nombre de ? égal au nombre de champs du formulaire.

  14. #14
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    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 : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    Bien. Maintenant je pense que tu es en mesure de comprendre.

    Dans ton code ci-dessous il y a deux erreurs.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $tabfusion=array_merge($tableau1,$tableau2);
    //var_dump($tabfusion);
     
    $sql = ('INSERT INTO personnes VALUES("$tabfusion")');

    1 - pour que la valeur d'une variable soit mise automatiquement dans une chaîne, cette chaîne doit être délimitée par " et non pas par '

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $toto = 1;
    print '$toto'; // affiche $toto
    print "$toto" // affiche 1
    2 - $tabfusion est un tableau et non pas une chaîne de caractères. Donc même si tu mets " ça ne fonctionnera pas. Il faut que tu obtiennes une chaîne de caractères qui ait la même structure que celle que tu utilises dans phpmyadmin.

    3 - il est hyperimportant de savoir débugger du code. La méthode est toute simple. On trace les valeurs des variables avec des print , on met des print "ce que tu veux comme commentaire " pour voir si le programme passe ou ne passe pas par tel ou tel endroit.
    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.

Discussions similaires

  1. formulaire avec champ obligatoire suivant si checkbox coché
    Par rattus34 dans le forum PHP & MySQL
    Réponses: 4
    Dernier message: 19/03/2013, 15h29
  2. [AC-2003] Formulaire avec champs variables
    Par Jeanpierre71 dans le forum IHM
    Réponses: 12
    Dernier message: 08/01/2013, 20h37
  3. formulaires dynamiques et variables vers php
    Par arcade_stg_master dans le forum Formulaires
    Réponses: 7
    Dernier message: 05/09/2011, 14h12
  4. Réponses: 2
    Dernier message: 13/05/2009, 14h47
  5. Nombre de colonne d'une table
    Par tom79 dans le forum Requêtes
    Réponses: 10
    Dernier message: 30/06/2006, 11h36

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