Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 33
  1. #1
    Membre habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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.

  2. #2
    Rédacteur/Modérateur
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    décembre 2006
    Messages
    2 353
    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 353
    Points : 4 741
    Points
    4 741

    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 habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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

  4. #4
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    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.
    - Réalisations
    - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.

  5. #5
    Membre habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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.

  6. #6
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2012
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2012
    Messages : 765
    Points : 1 375
    Points
    1 375

    Par défaut

    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()

  7. #7
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    Par défaut

    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.

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2012
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2012
    Messages : 765
    Points : 1 375
    Points
    1 375

    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 :
    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.

  9. #9
    Membre habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    Par défaut

    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?

  10. #10
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    Par défaut

    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.

  11. #11
    Membre habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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

  12. #12
    Membre du Club
    Inscrit en
    janvier 2007
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : janvier 2007
    Messages : 163
    Points : 40
    Points
    40

    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 habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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+

  14. #14
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    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.
    - Réalisations
    - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.

  15. #15
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    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 :
    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.

  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 : 131
    Points
    131

    Par défaut

    Et bien, vous avez dû être gentil pour un tel cadeau de Noel

  17. #17
    Membre habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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....

  18. #18
    Membre habitué Avatar de FadeToBlack
    Homme Profil pro Benoit
    En recherche de poste Web
    Inscrit en
    août 2010
    Messages
    208
    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 : 208
    Points : 145
    Points
    145

    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 :
    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 ?

  19. #19
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    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 :
    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.

  20. #20
    Expert Confirmé Sénior

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 680
    Points : 4 580
    Points
    4 580

    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 :
    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.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •