Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 17h39   #1
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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.
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 17h51   #2
Thes32
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur PHP, .Net, T-SQL
Inscription : décembre 2006
Messages : 2 354
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 354
Points : 4 628
Points : 4 628
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
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 19h37   #3
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 20h28   #4
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
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.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 00h23   #5
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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.
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 00h52   #6
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 609
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 609
Points : 1 064
Points : 1 064
Bonsoir,

tu devrait faire en sorte que ton formulaire t'envoi un tableau d'enfant :
Code :
<input type="text" name="enfant[nb][]" id="input" />
voir même :
Code :
<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()
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 05h31   #7
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
Encore plus simple :
Code :
<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 :
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;
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 11h19   #8
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 609
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 609
Points : 1 064
Points : 1 064
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 :
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.
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 12h10   #9
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
Bonjour à tous les deux,

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

Formulaire HTML :
Code :
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 :
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 :
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?
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 18h49   #10
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
Puisque c'est noël, un exemple de code générique :
Code :
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 :
<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
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 12h17   #11
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 16h49   #12
kitcarson23
Nouveau Membre du Club
 
Inscription : janvier 2007
Messages : 165
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 165
Points : 36
Points : 36
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.
kitcarson23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 18h20   #13
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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+
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 22h33   #14
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
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.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 22h59   #15
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
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 :
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>
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2013, 09h47   #16
Tsoko
Membre habitué
 
Avatar de Tsoko
 
Inscription : septembre 2006
Messages : 101
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : septembre 2006
Messages : 101
Points : 123
Points : 123
Et bien, vous avez dû être gentil pour un tel cadeau de Noel
__________________
Besoin d'un prestataire? creation site web
Tsoko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 12h06   #17
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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....
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 10h30   #18
FadeToBlack
Membre habitué
 
Avatar de FadeToBlack
 
Homme Benoit
En recherche de poste Web
Inscription : août 2010
Messages : 189
Détails du profil
Informations personnelles :
Nom : Homme Benoit
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : En recherche de poste Web
Secteur : Associations - ONG

Informations forums :
Inscription : août 2010
Messages : 189
Points : 140
Points : 140
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 :
INSERT INTO enfants ("Liste_De_Tous_Les_Champs_Issus_de_$champs_bdd) values (Liste_des_champs_renseignés)

exemple :
Code sql :
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 ?
FadeToBlack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 23h05   #19
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
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 :
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
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 00h55   #20
ABCIWEB
Expert Confirmé
 
Homme Alain
Inscription : septembre 2010
Messages : 1 917
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : septembre 2010
Messages : 1 917
Points : 2 851
Points : 2 851
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 :
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éalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h48.


 
 
 
 
Partenaires

Hébergement Web