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

PHP & Base de données Discussion :

insertion dans base de noms, dates et case à cocher


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut insertion dans base de noms, dates et case à cocher
    Bonjour à tous

    Après des journées de recherche sur google ,(qui pour le cas n'est pas mon ami), je fais de nouveau appel à vous !
    Voilà:
    Dans un formulaire, je sélectionne des volontaires grâce à un select multiple dans la liste du personnel (170 noms), et une période délimitée par une date de début et une date de fin. j'envoie tout ça dans une table (renfort) de ma base de données et ça marche parfaitement.
    une ligne dans ma table renfort ressemble à ça:

    id_renfort ----noms_selectionnes -------date_debut ----date_fin
    5..................nom1,nom2,nom3............ 2012-09-01......2012-09-04

    noms_selectionnes varie suivant le nombre de personnes qui se sont portées volontaires et les dates peuvent également varier
    Là où ça se complique c'est que pour chaque nom sélectionné, je dois pouvoir choisir les dates (avec un système de cochage des dates, sélectionner les dates auxquelles il peut être présent et inclure le résultat dans une autre table en insérant une ligne par personne.

    je suppose que je dois créer un nouveau formulaire mais je ne sais pas comment m'y prendre.

    Pour l'instant j'arrive grâce à un explode sur noms_selectionnes et à une fonction sur les dates de début et de fin à ce résultat:

    nom1
    nom2
    nom3
    nom4
    etc (toujours suivant le nombre de volontaires)

    si date début 2012-09-01 et date de fin 2012-09-04 (le nombre de jours peut varier) l'affichage des dates est le suivant:

    2012-09-01
    2012-09-02
    2012-09-03
    2012-09-04

    et là je n'arrive à plus rien d'autre. Je voudrais obtenir un résultat comme suit:

    nom1
    2012-09-01 case_à_cocher = 0
    2012-09-02 case_à_cocher = 1
    2012-09-03 case_à_cocher = 0
    2012-09-04 case_à_cocher = 1

    nom2
    2012-09-01 case_à_cocher = 1
    2012-09-02 case_à_cocher = 0
    2012-09-03 case_à_cocher = 0
    2012-09-04 case_à_cocher = 1

    etc pour toutes les personnes volontaires pour ce renfort.

    Il faut que ces résultats attérissent dans ma deuxième table (ligne_renfort) en incluant id_renfort, noms_selectionnes, dates cochées 1 et que le résultat ressemble à ceci:
    table ligne_renfort

    id_ligne_renfort ----- id_renfort ----- nom -------- dates
    1............................5....................nom1............2012-09-02,2012-09-04
    2............................5....................nom2............2012-09-01,2012-09-04
    3............................5....................nom3............2012-09-01,2012-09-02,2012-09-03,2012-09-04
    etc suivant les nombre de volontaires qui une fois de plus peut varier de 1 à 170 (nombre de personnes de la base)

    Piou, c'est pas simple tout ça.
    Merci d'avance pour les réponses et les voies que vous pourrez me donner .

  2. #2
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    bonjour

    j'ai déjà fait un truc comme ça.

    je te propose une interface différente.
    lorsque les personnes saisissent leurs dates ok, comme dans doodle tu leurs montre un calendrier et rien que leurs choix et éventuellement d'autres infos pour influencer le choix (le nombre de personne déjà volontaire...)

    toi quand tu choisis, tu fais jour par jour ou semaine par semaine et tu ne montre que les personnes bénévoles aux dates. ou toutes les personnes avec un rendu différent (barré, gras...) selon le status de la personne. De l'ajax te rendra la vie plus simple, quand même.

    le top c'est d'envoyer une réunion ics (?) lorsque la personne est sélectionnée.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut
    Bonjour Gene,
    Merci pour ta réponse (précieuse) qui m'aiguille. La solution d'un calendrier m'intéresse, je vais explorer cette voie pour la deuxième partie de mon site : Là où les volontaires pourront choisir comme un service à la carte.

    Ma question reste toujours d'actualité car elle me permettra de clore cette grosse partie de volontaires sélectionnés et aussi pour ma connaissance perso

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Je pense que tu as un problème de conception dans tes tables. Une règle très simple est de ce dire qu'à partir du moment ou tu met des données les une derrière les autres dans un champs c'est que tu as un soucis.

    Je ferais ça en 3 tables :

    Table renfort
    id_renfort ---date_debut ---date_fin

    Table renfort_volontaires
    id_renfort --- id_volontaire

    Table volontaires_dispo
    id_renfort --- id_volontaire --- date_dispo

    Ainsi dans la table renfort tu auras une entrée pour chaque "évènement" nécessitant des volontaire , l'équivalent de ta table renfort actuel

    Dans la table renfort_volontaires tu auras une ligne par volontaire disponible. Donc si tu as 25 volontaires pour le renfort 12 , ça te fera 25 lignes.

    Et finalement dans la table volontaires_dispo tu auras autant de lignes par volontaires que de jours où il sont présent. Ces jours devant être contenu dans l'interval de l'enregistrement de renfort correspondant.

    Avec cette structure de table il est facile de faire ce que tu souhaites. Ça nécessite en revanche quelques jointure et des clés étrangères

    Exemple de données :

    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
    Table renfort
    id_renfort ---date_debut ---date_fin
    ----------------------------------------
    5            2012-09-01     2012-09-05
     
    Table renfort_volontaires
    id_renfort --- id_volontaire
    ---------------------------------------
    5                      1
    5                      12
     
    Table volontaires_dispo
    id_renfort --- id_volontaire --- date_dispo
    -----------------------------------------
    5                  1                2012-09-03
    5                  1                2012-09-04
    5                  12               2012-09-02
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut
    Merci grunk

    Je vais refaire dans ce sens. Réponse dans quelques jours !

    Mimosa

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut
    Bonjour à tous,

    Voilà où j'en suis :
    Mon premier formulaire marche parfaitement. Sa page de traitement me remplie ma table `essai_renfort` avec les champs : renfort_mission, renfort_debut, renfort_fin

    La suite de la page de traitement récupère l'id du renfort fraichement créé grace à $id= $PDO->lastInsertId(); et l'insère dans le formulaire que voici:
    Dans le HEAD :
    <SCRIPT type="text/javascript" src="liste1_a_liste2.js"></SCRIPT>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    < FORM name="selection_volontaires" id="selection_volontaires" action="renfort_volontaires_ok" method="post" >
     
            <input type="text" class="style" size="3" name="creat_renfort_id" id="renfort_id" value="<?php echo $id;?>" onFocus="this.blur()"/>
     
            <?php require"liste1_a_liste2.php"; ?>
     
            <div class="centrage_submit">
     
                  <input type="submit" name="validation"  value="  Envoyer la demande  " onclick = "soumettre_1liste( this.form.choix )" />
    	      <input type="reset" value="Annuler" />
     
             </div>
    </FORM>
    Le js du formulaire ci dessus, liste1_a_liste2.js:

    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
     
    /*<![CDATA[*/
    <!--
    /*
    Codes originels © DR.
    Killeak : corrections pour compatibilite avec IE 6 et 7, Firefox 2 et Safari 2.
    */
    /*
      deplacer( liste_depart, liste_arrivee )
      Déplace depuis la liste de départ (argument 1) et à destination de la liste d'arrivée (argument 2) le ou les éléments sélectionnés par l'utilisateur, l'ajout se faisant à la suite des éléments déjà présents dans la liste d'arrivée.
    */
      function deplacer( liste_depart, liste_arrivee )
      {
        for( i = 0; i < liste_depart.options.length; i++ )
        {
          if( liste_depart.options[i].selected && liste_depart.options[i] != "" )
          {
            o = new Option( liste_depart.options[i].text, liste_depart.options[i].value );
            liste_arrivee.options[liste_arrivee.options.length] = o;
            liste_depart.options[i] = null;
            i = i - 1 ;
          }
          else
          {
            // alert( "aucun réserviste selectionné" );
          }
        }
      }
    /*
      deplacer_tout( liste_depart, liste_arrivee )
      Déplace depuis la liste de départ (argument 1) et à destination de la liste d'arrivée (argument 2) tous les éléments présents dans la liste de départ, en les ajoutant à la suite de ceux déjà présents dans la liste d'arrivée.
    */
      function deplacer_tout( liste_depart, liste_arrivee )
      {
        for( i = 0; i < liste_depart.options.length; i++ )
        {
          o = new Option( liste_depart.options[i].text, liste_depart.options[i].value );
          liste_arrivee.options[liste_arrivee.options.length] = o;
          liste_depart.options[i] = null;
          i = i - 1 ;
        }
      }
    /*
      deplacer_hautbas( liste, sens )
      Déplace au sein de la liste (argument 1) un élément dans le sens (argument 2) voulu : -1 pour remonter, +1 pour descendre.
    */
      function deplacer_hautbas( liste, sens )
      {
        // init
        var listemax = liste.length - 2;
        var listesel = liste.selectedIndex;
        // debordement
        if( ( listesel < 0 ) || ( listesel < 1 && sens == -1 ) || ( listesel > listemax && sens == 1 ) )
        {
          return false;
        }
        // permutation
        tmpopt = new Option( liste.options[listesel+sens].text, liste.options[listesel+sens].value );
        liste.options[listesel+sens].text = liste.options[listesel].text;
        liste.options[listesel+sens].value = liste.options[listesel].value;
        liste.options[listesel+sens].selected = true;
        liste.options[listesel].text = tmpopt.text;
        liste.options[listesel].value = tmpopt.value;
        liste.options[listesel].selected = false;
        return true;
      }
     
    /*
      soumettre_1liste( liste )
      Au moment de la soumission du formulaire, sélectionne automatiquement toutes les valeurs de la liste donnée indiquée dans l'argument, afin que les valeurs choisies soit récupérées dans le script de traitement.
    */
    function soumettre_1liste( liste )
    {
    	var listelen = liste.length;
        for( i = 0; i < listelen; i++ )
        {
          liste.options[i].selected = true;
        }
    }
    Et le require liste1_a_liste2.php :
    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
     
    <div id="liste_conseiller_2">
       <TABLE >
          <tr>
    	 <!-- SELECT qui contient la totalité des valeur possibles -->
    	      <TD align="center"><B><FONT size="2">Volontaires proposés</FONT></B>
     
    		<select name="dispo[]" id="dispo" size="9" style="width:214px" multiple OnDblClick="deplacer( this.form.dispo, this.form.choix );" >
    		   <?php // On appelle les identifiants
    		            // On sélectionne les champs 
    			   require"includes/identifiants.php";
    			   $request = $PDO->query('SELECT * FROM  essai_volontaires ');
    			   while( $row1 = $request->fetch(PDO::FETCH_ASSOC) )       
    			   {
    		    ?>
    		    <option value="<?php echo $row1['volontaire_id']?>" > <?php echo $row1['volontaire'].'<br>'; ?> </option> 
    		    <?php } 	?>
    		</select>
     
    	    </TD>
     
    	    <!-- BOUTONS qui choississent les valeurs a garder ou non -->
     
    	    <TD align="center"><br/> 
    		<input type="button" class="button" style="background:url('template/boutons/add.png');" OnClick="deplacer( this.form.dispo, this.form.choix );"><!-- voir le js liste1_a_liste2 pour compendre -->
    		<input type="button" class="button" style="background:url('template/boutons/remove.png');" OnClick="deplacer( this.form.choix, this.form.dispo );"><br/><!-- voir le js liste1_a_liste2 pour compendre -->
    		</td>
     
    		<!-- SELECT qui contient uniquement les valeurs selectionnés -->
    		   <TD align="center"><FONT size="2"><B>Réservistes retenus</B></FONT><br/>
    			<select name="choix[]" id="choix" size="9" style="width:214px" multiple  OnDblClick="deplacer( this.form.choix, this.form.dispo );"><!-- voir le js liste1_a_liste2 pour compendre -->
    			</select>
    		   </TD>
     
    		<!-- BOUTONS qui place les valeurs choisit dans l'ordre -->
    		    <td><br/>
    			<input type="button" class="button" style="background:url('template/boutons/up.png');"  OnClick="deplacer_hautbas( this.form.choix, -1 );"><!-- voir le js liste1_a_liste2 pour compendre -->
    			<input type="button" class="button" style="background:url('template/boutons/down.png');" OnClick="deplacer_hautbas( this.form.choix, 1 );"><!-- voir le js liste1_a_liste2 pour compendre -->
    		    </td>
    		</tr>
    	</table>
     
    </div>
    La page traitement de ce formulaire me renvoie bien les valeurs du formulaire mais je bloque à nouveau pour insérer une ligne pour chaque volontaire dans ma table. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
    	if(isset($_POST['choix']) && !empty($_POST['choix']) && isset($_POST['creat_renfort_id']) && !empty($_POST['creat_renfort_id']))	
    	{ foreach($_POST['choix'] as $index => $valeur) {
    			if (is_string($valeur)) {
    		        // Calcul de la taille du tableau $valeur
    $taillevaleur = sizeof($valeur);
    // Parcours du tableau
    for($i=0; $i<$taillevaleur; $i++)
    {
    echo $valeur[ $i ] ,'<br/>';
    $req1=$PDO->prepare ('INSERT INTO essai_renfort_volontaires ( rv_renfort_id, rv_id_volontaire ) VALUES ( :creat_renfort_id, $valeur ) ');
    $req1->execute(array ('creat_renfort_id'=>$_POST['creat_renfort_id'],
    		      'choix'=>$valeur ));
    }
    else { die('Pas de volontaire sélectionné !');}
    A force de faire des essais, je ne sais plus quoi faire ça ne m'enregistre rien dans ma base de données et j'ai des messages ou des notices d'erreurs sans arrêt.
    Désolé pour la colorisation du texte, je ne sais pas pourquoi ça ne me colorie pas tout.

    Merci d'avance pour votre aide

Discussions similaires

  1. Contrôle date avant insertion dans base de données
    Par Invité dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 24/02/2014, 18h15
  2. [MySQL] Fonction de date pour insertion dans base MySQL
    Par jubourbon dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 27/06/2010, 16h27
  3. Insertion dans base de données de nom de fichiers
    Par patickg dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2010, 19h04
  4. Réponses: 2
    Dernier message: 23/11/2006, 10h37
  5. Réponses: 9
    Dernier message: 13/10/2005, 18h24

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