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 :

Formulaire et sous Formulaire [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut Formulaire et sous Formulaire
    Bonjour à tous,

    Après la lecture du doc de Guillaume Rossolini, je me heurte à un problème de construction de formulaire.

    En simplifiant très fortement, disons que ma base de données recueille des informations sur des humains. Chaque humain à la possibilité de rentrer des infos sur ses enfants.

    Du coup, concrètement, j'ai un formulaire contenant diverses balises pour recueillir le non, prénom, date de naissance, ville etc....

    En dessous, j'aimerais faire en sorte qu'on puisse entrer le prénom et ladate de naissance des enfants. Mais comment prévoir si un adulte à 0,1 ou 36 enfants ?
    Je ne peux quand même pas mettre 20(30,40...) input(s) pour répondre à toutes les possibilités.
    Je me suis tourné vers une nouvelle fenetre qui permet d'enregistrer les enfants un à un en fonction de l'id de l'individu de la fenêtre principale (grace à des $_SESSION['id_users']. Mais cela ne me plait pas.

    Avant je faisais tout cela sous ACCESS, et il n'y avait pas de problème mais en Php_Html_MySql, je ne sais pas......
    Auriez-vous une super idée pour me dépanner.

    Merci à tous et surtout bonnes fêtes.
    Douter de tout, toujours, et surtout de soi-même...

  2. #2
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Salut,

    Tu pourrais toujours le faire en deux temps :

    - Dans un premier tu recueille le nombre d'enfants N
    - ensuite tu produits un formulaire contentant N inputs.
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  3. #3
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    SAlut Thes32,

    Effectivement, je n'y avais pas pensé. J'avais aussi envisagé de faire un bouton avec une fonction JavaScript, qui me créerait des "Frères aux inputs". Mais je ne sais pas si c'est vraiment possible.

    Et puis il y a toujours le risque (classique) que l'internaute n'ait pas activé Javascript.

    Du coup ta solution est intéressante
    Douter de tout, toujours, et surtout de soi-même...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    SAlut Thes32,

    Effectivement, je n'y avais pas pensé. J'avais aussi envisagé de faire un bouton avec une fonction JavaScript, qui me créerait des "Frères aux inputs". Mais je ne sais pas si c'est vraiment possible.
    C'est tout a fait possible et même assez facile et c'est cette solution que j'aurais privilégiée pour éviter d'avoir à faire rafraichir la page.
    Evidemment le plus complet serait d'implémenter les deux méthodes (ajout javascript et php si javascript désactivé) mais ça demande plus de boulot. Maintenant sauf pour ce qui touche à la sécurité je ne double plus mes scripts car tout le monde a javascript activé par défaut (sinon y'a même plus un site sur deux qui fonctionne correctement...) Donc c'est à voir avec ton cahier des charges.

  5. #5
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut et merci à tous les deux...

    Maintenant, une autre question se pose :

    Lors du "submit" de mon formulaire, je vais me retrouver avec des $_POST[enfant1], $_POST[enfant2], $_POST[enfant3] etc.... évidemment avec les autres champs associés.

    Du coup, lors de l'appel de ma classe d'insertion, comment faire pour qu'il y ait x insertions distinctes. J'imagine une boucle for quelconque. Mais comment déterminer ce nombre ?

    Toujours grace à JS qui récupère le nombre de "frères" et passe ce résultat à la classique variable $i de la boucle ? PArce que j'avoue là je seche et je ne sais pas comment construire cette classe.
    Douter de tout, toujours, et surtout de soi-même...

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonsoir,

    tu devrait faire en sorte que ton formulaire t'envoi un tableau d'enfant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="enfant[nb][]" id="input" />
    voir même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="enfant[][]" id="input" />
    si tu n'a pas besoin de retenir un ordre dans les enfants (enfant 1, enfant 2, ...)

    où nb est à remplasser par un nombre que tu générera en JS,

    ensuite dans ton script php qui récupère ton tableau et tu le traite avec la fonction foreach()
    une réponse vous a permis d'avancer ?

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input class="enfant" type="text" name="enfant[]" />
    Il vaut mieux éviter de générer un id (qui doit être unique dans ta page) ainsi tu peux simplement faire un clone de cet input en javascript pour le réinsérer on click sur le bouton qui servira à ajouter des champs "enfants". A réception en php tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $enfants = array_map('trim',$_POST['enfant']);//supprime les espace vides
    $enfants = array_filter($enfants);//supprime les entrées vides du tableau
     
    // dans ton tableau $enfants il te reste les champs qui ont été renseignés et donc tu as le nombre avec count($enfants) et la liste avec un 
    foreach($enfants as $value) echo $value;

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    une petite chose c'est qu'un enfant aura plusieurs informations (nom, prenom, ...),

    je pense qu'il sera alors obligé de passer par une syntaxe du type :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <input type="text" name="enfant[nb][nom]" class="input" />
    <input type="text" name="enfant[nb][prenom]" class="input" />
    <input type="number" name="enfant[nb][age]" class="input" />

    et pour chaque enfant il devra augmenter la valeur de nb de 1 pour que chaque index du tableau contienne un tableau qui contiendra les information d'un enfant.
    une réponse vous a permis d'avancer ?

  9. #9
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Bonjour à tous les deux,

    @eixia93 :
    Pendant que tu envoyais ton post je me suis fais ceci

    Formulaire HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form method="post" action="../recup.php">
     
    	<fieldset>
    		<legend>les enfants</legend>
    		<div id="child">
     
     
    		</div><input type="button" value="Ajouter un enfant" onclick="ajouter()">
    	</fieldset>
    	<input type="button" value="Envoyer" onclick="submit()">
    	</form>
    Dans un fichier js j'ai la fonction ajouter() ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ajouter(){
     
    	 var nb = $('.enf').length;
     
    	 var item = '<label>Nom: </label><input type="text" class="enf" name ="enfant['+nb+'][nom]">'
    	 var item1 = '<abel>Prenom: </label><input type="text"  name ="enfant['+nb+'][prenom]">'
    	 var item2 = '<abel>Date de naissance: </label><input type="text"  name ="enfant['+nb+'][DateNaiss]"><br/>'
    		$(item+item1+item2).appendTo('#child');
     
    	}
    Puis dans le fichier php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $recup = $_POST['enfant'];
    foreach ($recup as $value=>$key) {
    	echo ($key['nom']. ' ---> '.$key['prenom'].' ----->'.$key['DateNaiss'].'<br/>');
    	}
    Du coup cela fonctionne correctement à mon gout, bien que je ne sache pas si in fine c'est correct.
    Comment arranger les idées d'ABCIWEB pour enlever les blancs et les lignes nulles?
    Douter de tout, toujours, et surtout de soi-même...

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Puisque c'est noël, un exemple de code générique :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    <?php 
    if (isset($_POST['enfant']))
    {
    	$tab_enfants = array();
     
    	$champs = array_keys($_POST['enfant']);
     
    	//On remet le tableau sous une forme conventionnelle et on supprime les espaces vides
    	foreach ($_POST['enfant'] as $value)
    	{				
    		foreach($value as $k => $v)
    		{
    			$tab_enfants[$k][] = trim($v);
    		}
    	}	
     
     
    	// Pour supprimer les lignes dont tous les champs n'ont pas été remplis on peut faire :
    	// Supprime les champs vides
    	$tab_enfants = array_map('array_filter',$tab_enfants);
    	// Supprime les éléments qui n'ont pas le nombre suffisant de champs
    	$nb_champs = count($champs);
    	foreach ($tab_enfants as $key => $value)
    	{
    		if(count($value) < $nb_champs) unset($tab_enfants[$key]);
    	}
    	// Fin du traitement de suppression des lignes dont tous les champs n'ont pas été remplis
     
     
     
     
    	// Si les champs sont nommés avec le même nom que les champs en bdd on peut automatiser la création de la requête
    	// Id = clé étrangère de la table principale. Pour l'exemple $ID = 12
    	$ID = 12;
     
    	array_unshift($champs,'Id');
     
    	$champs_bdd = '('.implode(',',$champs).')';
     
     
    	//On crée la syntaxe pour insérer les valeurs en bdd : 
    	$tab_value = array();
    	foreach ($tab_enfants as $value)
    	{
    		$valeurs = array();
    		foreach($value as $v)
    		{
    			$valeurs[] = "'".mysql_real_escape_string($v)."'";
    		}
    		array_unshift($valeurs,$ID);
    		$valeurs = '('.implode(',',$valeurs).')';
     
    		$tab_value[] = $valeurs;
    	}
    	$tab_value = implode(",",$tab_value);
     
     
    	// Ecriture de la requête
    	$sql = "INSERT INTO enfants ".$champs_bdd."  VALUES ".$tab_value."";
     
    	// Contrôle pour vérification
    	echo $sql;
     
            //...
    }	
     
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>Document sans titre</title>
    <style type="text/css">
    #post_enfant {
    	display:none;
    }
    </style>
    <script type="text/JavaScript">
    <!--
     
    function Add_Input(id_content,id_destination) // Ajoute une ligne de champs
    {
    		var content = document.getElementById(id_content);	
    		// Je cherche le tag <p> dans content
    		var tab_content = content ? content.getElementsByTagName('p') : new Array();
     
    		var destination = document.getElementById(id_destination); 
     
    		if(tab_content.length > 0 && destination)
    		{				
    			destination.appendChild(tab_content[0].cloneNode(true));
    		}
    }
    -->
    </script>
    </head>
     
    <body>
     
        <div id = "post_enfant">
            <p>
                <label>nom<input type="text" name="enfant[nom][]" class="enfant" /></label>
                <label>prénom<input type="text" name="enfant[prenom][]" class="enfant" /></label>
                <label>age<input type="text" name="enfant[age][]" class="enfant" /></label>
            </p>
        </div>
     
        <form method = "post" action="#">
     
            <div id = "enfants"></div>
     
            <div>
                <input type = "button" value="Ajouter un enfant" onClick="Add_Input('post_enfant','enfants')" />
                <input type = "submit" value="ok" />
            </div>
     
        </form>
    </body>
    </html>
    L'avantage d'une telle syntaxe c'est que tout se fait automatiquement en fonction du html contenu dans id = "post_enfant". Par exemple si tu devais ajouter un champ "ville de naissance", il te suffirait de rajouter dans le bloc "post_enfant" (à l'intérieur du bloc p), la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <label>ville de naissance<input type="text" name="enfant[ville_naissance][]" class="enfant" /></label>
    ainsi que le champ 'ville_naissance' dans ta table bdd "enfants" et c'est tout

  11. #11
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Merci papa noël


    Désolé de n'avoir pas répondu hier, mais j'étais kidnappé par mon foie....

    J'ai commencé à étudier ton script, et effectivement, il est plus intéressant que le mien. Merci.

    Je vais finir de le regarder de plus près...

    Je te tiens au courant. Si tout ce passe bien je rajoute un RESOLU
    Douter de tout, toujours, et surtout de soi-même...

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 219
    Points : 76
    Points
    76
    Par défaut
    Bonjour
    je me posais la question de savoir, au lieu d'attendre la fin de la saisie de l'ensemble des enfants pourquoi ne pas créer des boutons d"ajout et suppression, de ce fait lorsque tu créer un ligne d'enfant, en creant une nouvelle ligne tu enregistre la ligne précédente, et lorsque tu as fait une erreur en ajoutant trop d'enfant , tu peux sélectionner la ligne et supprimer dans la méme fenêtre.
    lorsque de l'enregistrement de chaque ligne d'enfant, ID tu pere est enregistrée en clé secondaire.
    de ce fait tu valide d'abord la fenêtre de sous-formulaire enfant avant de valider les informations du père.
    si j'ai tiré à coter alors excuses moi.
    bonne chance.

  13. #13
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut kitcarson23 et bonne années à tous,

    En fait, ta méthode est envisageable mais il faudrait revoir le tout. On peut tout à fait renvoyer une requête AJAX à chaque création de ligne pour enregistrer la ligne précedente. Il faut aussi ajouter un bouton pour l'enregistrement de la dernière ligne.

    Cela veut aussi dire que les informations liés au parent est déjà entré dans la base puisqu'il faut avoir son ID. Et puis, il s'agit ici d'une table de liaison issu d'une relation récursive avec des cardinalité n,n.

    Je n'ai pas une table parents et une table enfants, mais une seule table individus, qui peuvent avoir des enfants ou être enfants d'individus de la base.

    Quoiqu'il en soit ta solution est envisageable. Enfin, je ne vois pas où il pourrait y avoir des problèmes. Le tout serait de savoir s'il y a une différence de performance entre les deux méthodes...

    Je garde ton idée dans un creux de ma tête, histoire de la traiter plus tard. J'ai d'ailleurs dans ma base, d'autres relations assez similaires. Je peux utiliser les deux méthodes et voir celle qui correspond le mieux ou est la plus rapide en terme de codage.

    A+
    Douter de tout, toujours, et surtout de soi-même...

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par kitcarson23 Voir le message
    ...lors de l'enregistrement de chaque ligne d'enfant, ID tu pere est enregistrée en clé secondaire.
    de ce fait tu valide d'abord la fenêtre de sous-formulaire enfant avant de valider les informations du père.
    si j'ai tiré à coter alors excuses moi.
    bonne chance.
    Nan c'est du travail en plus pour avoir de potentiels problèmes en plus. Imagines que le formulaire soit abandonné en cours de route et tu auras enregistré en dbb des truc inutiles... Il vaut mieux une soumission générale du formulaire pour éviter de générer des incohérences dans la bdd.

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et pour être complet,

    Dans mon dernier code, je supprime une ligne si tous les champs qui constituent la ligne n'ont pas été remplis. On peut ne supprimer une ligne que si certains champs n'ont pas été remplis. Il suffit pour cela de reconstruire le premier tableau créé dans son intégralité (avec ses clés) :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    <?php 
    if (isset($_POST['enfant']))
    {
    	$tab_enfants = array();
    	$values = array();
     
    	$champs = array_keys($_POST['enfant']);
     
    //On remet le tableau sous une forme conventionnelle et on supprime les espaces vides
    	foreach ($_POST['enfant'] as $key => $value)
    	{				
    		foreach($value as $k => $v)
    		{
    			// si on a besoin de key
    			$tab_enfants[$k][$key] = trim($v);
    			// sinon on peut faire
    			//$tab_enfants[$k][] = trim($v);
    		}
    	}	
     
    	// Pour supprimer les lignes dont tous les champs ou certains champs n'ont pas été remplis on peut faire :
    	// Supprime les champs vides
    	$tab_enfants = array_map('array_filter',$tab_enfants);
     
    	// Supprime les lignes qui n'ont pas tous les champs remplis
    	/*
    	$nb_champs = count($champs);
    	foreach ($tab_enfants as $key => $value)
    	{
    		if(count($value) < $nb_champs) unset($tab_enfants[$key]);
    	}*/
    	// Fin du traitement de supression des lignes dont tous les champs n'ont pas été remplis
     
    	// Supprime les lignes dont certains champs n'ont pas été remplis
    	$champs_obligatoires = array('nom','prenom');
    	foreach ($tab_enfants as $key => $value)
    	{
    		foreach ($champs_obligatoires as $index)
    		if(!array_key_exists($index, $value)) unset($tab_enfants[$key]);
    	}
    	// Fin du traitement de supression des lignes dont certains champs n'ont pas été remplis
     
     
     
     
    	// Si les champs sont nommés avec le même nom que les champs en bdd on peut automatiser la création de la requete
    	// Id = clé étrangère de la table principale. Pour l'exemple $ID = 12
    	$ID = 12;
     
    	array_unshift($champs,'Id');
     
    	$champs_bdd = '('.implode(',',$champs).')';
     
     
    	//On crée la syntaxe pour insérer les champs en bdd : 
    	$tab_value = array();
    	foreach ($tab_enfants as $value)
    	{
    		$valeurs = array();
    		foreach($value as $v)
    		{
    			$valeurs[] = "'".mysql_real_escape_string($v)."'";
    		}
    		array_unshift($valeurs,$ID);
    		$valeurs = '('.implode(',',$valeurs).')';
     
    		$tab_value[] = $valeurs;
    	}
    	$tab_value = implode(",",$tab_value);
     
     
    	// Ecriture de la requête
    	$sql = "INSERT INTO enfants ".$champs_bdd."  VALUES ".$tab_value."";
     
    	// Contrôle pour vérifications
    	echo $sql;
     
    }
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>Document sans titre</title>
    <style type="text/css">
    #post_enfant {
    	display:none;
    }
    </style>
    <script type="text/JavaScript">
    <!--
     
    function Add_Input(id_content,id_destination) // Ajoute un champ de tlchargement
    {
    		var content = document.getElementById(id_content);	
    		// Je cherche le tag <p> dans content
    		var tab_content = content ? content.getElementsByTagName('p') : new Array();
     
    		var destination = document.getElementById(id_destination); 
     
    		if(tab_content.length > 0 && destination)
    		{				
    			destination.appendChild(tab_content[0].cloneNode(true));
    		}
    }
    -->
    </script>
    </head>
     
    <body>
     
        <div id = "post_enfant">
            <p>
                <label>nom<input type="text" name="enfant[nom][]" class="enfant" /></label>
                <label>prénom<input type="text" name="enfant[prenom][]" class="enfant" /></label>
                <label>age<input type="text" name="enfant[age][]" class="enfant" /></label>
            </p>
        </div>
     
        <form method = "post" action="#">
     
            <div id = "enfants"></div>
     
            <div>
                <input type = "button" value="Ajouter un enfant" onClick="Add_Input('post_enfant','enfants')" />
                <input type = "submit" value="ok" />
            </div>
     
        </form>
    </body>
    </html>

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Points : 142
    Points
    142
    Par défaut
    Et bien, vous avez dû être gentil pour un tel cadeau de Noel

  17. #17
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut à tous et un grand merci à Papa "Abciweb" Noël....

    Je suis d'accord avec Abciweb, sur la soumission du formulaire dans son entier avec toutes les sous-parties. Il faut pourtant bien hiérarchiser cette soumission dans la mesure où la clef de la table individus n'existe pas...
    IL faut donc insérer la ligne concernant l'individus puis récuperer la clef (via lastinsertID()) et s'en servir pour l'enregistrement des autres parties du formulaires.

    JE me disais un truc, là nous parlons de l'enregistrement des données donc via un INSERT. Mais dans le cas d'une modification, n'est-ce pas plus pratique d'avoir un formulaire identique qui permettrait la mise à jouur des données pour chaque partie séparément, au lieu d'une soumission générale et donc des UPDATE table à n'en plus finir ?

    Du coup cela double le nombre de fichiers dans mon MVC mais bon....
    Douter de tout, toujours, et surtout de soi-même...

  18. #18
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut ABCIWEB,

    Je viens de finir de contruire l'ensemble de mon formulaire et d'adapter ton script au mien. Mais je me heurte à un petit problème.
    A la ligne 23, les champs non remplis sont "supprimés" de l'array $tab_enfants.

    Malheureusement dans la requête générée, on se retrouve avec une instruction :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO enfants ("Liste_De_Tous_Les_Champs_Issus_de_$champs_bdd) values (Liste_des_champs_renseignés)

    exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO enfants(ID,nom,prenom,age) VALUES
    (12,'Nom1','prenom1', '22'),
    (13,'nom2','prenom2')

    Dans ce cas, MYSQL me renvoie une erreur puisque le second insert ne comporte pas autant de valeurs qu'il est mentionné de le début de l'instruction.
    Tu es d'accord ?
    Douter de tout, toujours, et surtout de soi-même...

  19. #19
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui je suis d'accord ... je m'étais concentré sur la sélectivité des champs nécessaires sans faire attention au petit pb que cela créerait dans la construction automatique de la requête
    Mais qu'à cela ne tienne, comme php est le roi des fonctionnalités sur les tableaux, on va pouvoir s'en tirer avec deux petites fonctions supplémentaires, à savoir array_fill_keys et array_replace :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    <?php 
    if (isset($_POST['enfant']))
    {
    	$tab_enfants = array();
     
    	$champs = array_keys($_POST['enfant']);
     
    	//On remet le tableau sous une forme conventionnelle et on supprime les espaces vides
    	foreach ($_POST['enfant'] as $key => $value)
    	{				
    		foreach($value as $k => $v)
    		{
    			$tab_enfants[$k][$key] = trim($v);
    		}
    	}	
     
    	// Pour supprimer les lignes dont tous les champs ou certains champs n'ont pas été remplis on peut faire :
    	// Supprime les champs vides
    	$tab_enfants = array_map('array_filter',$tab_enfants);
     
    	// Supprime les lignes qui n'ont pas tous les champs remplis
    	/*
    	$nb_champs = count($champs);
    	foreach ($tab_enfants as $key => $value)
    	{
    		if(count($value) < $nb_champs) unset($tab_enfants[$key]);
    	}*/
    	// Fin du traitement de supression des lignes dont tous les champs n'ont pas été remplis
     
    	// Supprime les lignes dont certains champs n'ont pas été remplis
    	$champs_obligatoires = array('nom','prenom');
     
    	$champ_defaut = array_fill_keys($champs, '');
     
    	foreach ($tab_enfants as $key => $value)
    	{
    		foreach ($champs_obligatoires as $index)
    		{
    			if(!array_key_exists($index, $value)) unset($tab_enfants[$key]);
    		}
    		//Rétabli le nombre de champs nécessaires pour une insertion automatique en bdd 
    		if(isset($tab_enfants[$key])) $tab_enfants[$key] = array_replace($champ_defaut, $value);
    	}
    	// Fin du traitement de suppression des lignes dont certains champs n'ont pas été remplis
     
     
     
     
    	// Si les champs sont nommés avec le même nom que les champs en bdd on peut automatiser la création de la requete
    	// Id = clé étrangère de la table principale. Pour l'exemple $ID = 12
    	$ID = 12;
     
    	array_unshift($champs,'Id');
     
    	$champs_bdd = '('.implode(',',$champs).')';
     
     
    	//On crée la syntaxe pour insérer les champs en bdd : 
    	$tab_value = array();
    	foreach ($tab_enfants as $value)
    	{
    		$valeurs = array();
    		foreach($value as $v)
    		{
    			$valeurs[] = "'".mysql_real_escape_string($v)."'";
    		}
    		array_unshift($valeurs,$ID);
    		$valeurs = '('.implode(',',$valeurs).')';
     
    		$tab_value[] = $valeurs;
    	}
    	$tab_value = implode(",",$tab_value);
     
     
    	// Ecriture de la requête
    	$sql = "INSERT INTO enfants ".$champs_bdd."  VALUES ".$tab_value."";
     
    	// Contrôle pour vérifications
    	echo $sql;
     
    }
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>Document sans titre</title>
    <style type="text/css">
    #post_enfant {
    	display:none;
    }
    </style>
    <script type="text/JavaScript">
    <!--
     
    function Add_Input(id_content,id_destination) // Ajoute un champ de tlchargement
    {
    		var content = document.getElementById(id_content);	
    		// Je cherche le tag <p> dans content
    		var tab_content = content ? content.getElementsByTagName('p') : new Array();
     
    		var destination = document.getElementById(id_destination); 
     
    		if(tab_content.length > 0 && destination)
    		{				
    			destination.appendChild(tab_content[0].cloneNode(true));
    		}
    }
    -->
    </script>
    </head>
     
    <body>
     
        <div id = "post_enfant">
            <p>
                <label>nom<input type="text" name="enfant[nom][]" class="enfant" /></label>
                <label>prénom<input type="text" name="enfant[prenom][]" class="enfant" /></label>
                <label>age<input type="text" name="enfant[age][]" class="enfant" /></label>
            </p>
        </div>
     
        <form method = "post" action="#">
     
            <div id = "enfants"></div>
     
            <div>
                <input type = "button" value="Ajouter un enfant" onClick="Add_Input('post_enfant','enfants')" />
                <input type = "submit" value="ok" />
            </div>
     
        </form>
    </body>
    </html>
    Cela devrait fonctionner correctement maintenant

  20. #20
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Ouais... en y repensant un peu plus tard, j'ai ajouté du code pour ne pas avoir à en supprimer, mais il aurait été plus simple de supprimer le array_filter et de modifier la boucle. Donc voici un autre exemple plus simple (je laisse les précédentes versions en commentaire car certaines astuces peuvent servir dans d'autres circonstances) :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    <?php 
    if (isset($_POST['enfant']))
    {
    	$tab_enfants = array();
     
    	$champs = array_keys($_POST['enfant']);
     
    	//On remet le tableau sous une forme conventionnelle et on supprime les espaces vides
    	foreach ($_POST['enfant'] as $key => $value)
    	{				
    		foreach($value as $k => $v)
    		{
    			$tab_enfants[$k][$key] = trim($v);
    		}
    	}	
     
    	// Pour supprimer les lignes dont tous les champs n'ont pas été remplis on peut faire :
    	/*
    	// Supprime les champs vides
    	$tab_enfants = array_map('array_filter',$tab_enfants);
    	$nb_champs = count($champs);
    	
    	foreach ($tab_enfants as $key => $value)
    	{
    		if(count($value) < $nb_champs) unset($tab_enfants[$key]);
    	}
    	*/
    	// Fin du traitement de suppression des lignes dont tous les champs n'ont pas été remplis
     
     
    	// Supprime les lignes dont certains champs n'ont pas été remplis
    	/*
    	$champs_obligatoires = array('nom','prenom');
    	
    	// Supprime les champs vides
    	$tab_enfants = array_map('array_filter',$tab_enfants);
    	
    	// Crée un tableau ayant comme index les valeurs de "champs" et des valeurs vides ''
    	$champ_defaut = array_fill_keys($champs, '');
    
    	foreach ($tab_enfants as $key => $value)
    	{
    		foreach ($champs_obligatoires as $index)
    		{
    			if(!array_key_exists($index, $value)) unset($tab_enfants[$key]);
    		}
    		//Rétabli le nombre de champs nécessaires pour une insertion automatique en bdd 
    		if(isset($tab_enfants[$key])) $tab_enfants[$key] = array_replace($champ_defaut, $value);
    	}
    	*/
    	// Fin du traitement de suppression des lignes dont certains champs n'ont pas été remplis
     
     
    	// Ou plus simplement
    	// Supprime les lignes dont certains champs n'ont pas été remplis
    	$champs_obligatoires = array('nom','prenom');
     
    	foreach ($tab_enfants as $key => $value)
    	{
    		foreach ($value as $k => $v)
    		if(in_array($k,$champs_obligatoires) && $v == '') unset($tab_enfants[$key]);
    	}
    	// Fin du traitement de suppression des lignes dont certains champs n'ont pas été remplis
     
     
    	// Si les champs sont nommés avec le même nom que les champs en bdd on peut automatiser la création de la requete
    	// Id = clé étrangère de la table principale. Pour l'exemple $ID = 12
    	$ID = 12;
     
    	array_unshift($champs,'Id');
     
    	$champs_bdd = '('.implode(',',$champs).')';
     
     
    	//On crée la syntaxe pour insérer les champs en bdd : 
    	$tab_value = array();
    	foreach ($tab_enfants as $value)
    	{
    		$valeurs = array();
    		foreach($value as $v)
    		{
    			$valeurs[] = "'".mysql_real_escape_string($v)."'";
    		}
    		array_unshift($valeurs,$ID);
    		$valeurs = '('.implode(',',$valeurs).')';
     
    		$tab_value[] = $valeurs;
    	}
    	$tab_value = implode(",",$tab_value);
     
     
    	// Ecriture de la requête
    	$sql = "INSERT INTO enfants ".$champs_bdd."  VALUES ".$tab_value."";
     
    	// Contrôle pour vérifications
    	echo $sql;
     
    }
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>Document sans titre</title>
    <style type="text/css">
    #post_enfant {
    	display:none;
    }
    </style>
    <script type="text/JavaScript">
    <!--
     
    function Add_Input(id_content,id_destination) // Ajoute un champ de tlchargement
    {
    		var content = document.getElementById(id_content);	
    		// Je cherche le tag <p> dans content
    		var tab_content = content ? content.getElementsByTagName('p') : new Array();
     
    		var destination = document.getElementById(id_destination); 
     
    		if(tab_content.length > 0 && destination)
    		{				
    			destination.appendChild(tab_content[0].cloneNode(true));
    		}
    }
    -->
    </script>
    </head>
     
    <body>
     
        <div id = "post_enfant">
            <p>
                <label>nom<input type="text" name="enfant[nom][]" class="enfant" /></label>
                <label>prénom<input type="text" name="enfant[prenom][]" class="enfant" /></label>
                <label>age<input type="text" name="enfant[age][]" class="enfant" /></label>
            </p>
        </div>
     
        <form method = "post" action="#">
     
            <div id = "enfants"></div>
     
            <div>
                <input type = "button" value="Ajouter un enfant" onClick="Add_Input('post_enfant','enfants')" />
                <input type = "submit" value="ok" />
            </div>
     
        </form>
    </body>
    </html>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Lier un sous-formulaire à un sous-formulaire
    Par bobosh dans le forum IHM
    Réponses: 2
    Dernier message: 02/03/2021, 11h45
  2. Réponses: 5
    Dernier message: 06/05/2015, 12h24
  3. Réponses: 2
    Dernier message: 24/06/2013, 09h31
  4. Réponses: 2
    Dernier message: 23/06/2013, 21h07
  5. Accéder à un sous-formulaire de sous-formulaire
    Par touftouf57 dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/11/2008, 19h04

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