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 :

Inscription à la cantine, adodb ? [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Invité
    Invité(e)
    Par défaut
    1- Oui, c'est bon.
    La syntaxe (e) => { n'est effectivement pas compatible avec I.E. !



    2- Regarde aussi le code HTML généré : "Ctrl" + "U".
    Tu verras comment sont construits le script JS et le tableau HTML.

    3- concernant la table en BDD :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `repas_pris` (
      `nom_id` varchar(50) NOT NULL,
      `nom` varchar(50) NOT NULL,
      `date` date NOT NULL,
      `type_repas` tinyint(4) NOT NULL DEFAULT '0',
      `inscrit_par` varchar(100) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Remarque : tu devrais changer le nom de la colonne `date` en `date_machin` (n'importe quoi, sauf `date` !) car "DATE" est un mot réservé en SQL.
    Ou alors, dans les requêtes, il faudra systématiquement mettre les "apostrophes inverses" : `date`
    Dernière modification par Invité ; 22/08/2019 à 15h32.

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Peut-on revenir sur ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $pdo_params = array();
    $pdo_params[':user_id'] = $user_id;
    $dates_list = array();
    foreach( $dates_array as $idx => $date ){
    	$pdo_params[':date'.$idx] = $date;
    	$dates_list[] = ':date'.$idx;
    }
    $dates_list = implode(',',$dates_list);	// chaine de la forme :date0,:date1,:date2,...
    J'essaie de bien comprendre, mais j'ai du mal avec le foreach avec une clé, je ne comprends pas ce qu'il fait.
    On crée un tableau (pdo_params) qui contient l'user_id et un autre tableau, qui lui-même contient les 10 dates, lundi à vendredi des deux semaines qui nous intéressent.
    Mais quand je fais un var_dump sur dates_array et pdo_params, je me rends compte que les dates sont écrites pareil. Du coup, que rajoute le foreach avec le idx par rapport à un foreach classique ?


    Voici ce que j'étais en train d'écrire.
    Et à force de mettre des var_dump, de bien regarder, chercher, comprendre, je finis par comprendre le principe de l'array, et du rajouter de la clé, du coup l'index de la ligne, pour récupérer des dates, qui auront des ids facile à utiliser à l'envoi du formulaire.

    Bref, je n'apprends rien à personne ici, si ce n'est que la réflexion amène clairement la compréhension. Et le fait de travailler avec des valeurs que je connais et comprends (user, date_repas (corrigé), repas...) permet vraiment de comprendre plus facilement qu'avec des tutoriaux aux valeurs abstraites.

    Donc vraiment, merci pour avoir pris le temps de m'aider. Et merci pour les futures questions que je vais encore probablement avoir.

  3. #23
    Invité
    Invité(e)
    Par défaut
    OK.
    $pdo_params * et $dates_list ** servent pour la requête PDO, préparée.

    * On a ici des "placeholders nommés" -> Voir https://fmaz.developpez.com/tutoriel...endre-pdo/#LIV
    • Par convention, le "placeholder nommé" commence par ":"
    • et (généralement) on lui donne le même nom que la colonne (pour plus de simplicité de lecture !)

    $pdo_params sert à relier ces "placeholders nommés" aux variables PHP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$pdo_select = $pdo->prepare($rech_query);
    	$pdo_select->execute($pdo_params);
    ** $dates_list permet de construire le bout de code : :date0,:date1,:date2,:date3,:date4,:date5,:date6,:date7,:date8,:date9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dates_list = implode(',',$dates_list);	// chaine de la forme :date0,:date1,:date2,...
    Voir la syntaxe SQL : "SELECT ... IN (...)"

    Pour visualiser la requête SQL, et les paramètres associés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $rech_query;
    var_dump($pdo_params);
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_id, nom, date, type_repas FROM repas_pris WHERE inscrit_par = :user_id AND date IN (:date0,:date1,:date2,:date3,:date4,:date5,:date6,:date7,:date8,:date9) ORDER BY date ASC;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    array (size=11)
      ':user_id' => string 'nom.damien' (length=10)
      ':date0' => string '2019-08-19' (length=10)
      ':date1' => string '2019-08-20' (length=10)
      ':date2' => string '2019-08-21' (length=10)
      ':date3' => string '2019-08-22' (length=10)
      ':date4' => string '2019-08-23' (length=10)
      ':date5' => string '2019-08-26' (length=10)
      ':date6' => string '2019-08-27' (length=10)
      ':date7' => string '2019-08-28' (length=10)
      ':date8' => string '2019-08-29' (length=10)
      ':date9' => string '2019-08-30' (length=10)
    Dernière modification par Invité ; 22/08/2019 à 13h34.

  4. #24
    Invité
    Invité(e)
    Par défaut
    Si tu regardes bien le code du traitement du $_POST (message #17), le principe est le même.

    A NOTER une (petite) subtilité toutefois, sur l'intérêt des requêtes préparées PDO :
    • ->prepare() : une requête n'a besoin d'être préparée qu'UNE FOIS. (c'est pour ça qu'elle est AVANT les boucles foreach)
    • ->execute() : on peut alors l'exécuter AUTANT DE FOIS que nécessaire (ici, DANS les boucles foreach)



    Exemple de la requête INSERT :
    1- PREPARATION -> UNE SEULE FOIS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	// 2- INSERT
    	$insert_query = "INSERT INTO repas_pris
    		(nom_id, nom, date, type_repas, inscrit_par) 
    		VALUES
    		(:nom_id, :nom, :date, :type_repas, :inscrit_par) ;";
    	try {
    		$pdo_insert = $pdo->prepare($insert_query);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    On définit ici les "place holders nommés" : :nom_id, :nom, :date, :type_repas, :inscrit_par

    2- EXECUTION -> PLUSIEURS FOIS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    				// 2- on peut INSERER en BDD
    				try {
    					$pdo_insert->execute(array(
    						':nom_id' => $nom_id,
    						':nom' => $nom,
    						':date' => $date,
    						':type_repas' => $type,
    						':inscrit_par' => $inscrit_par,
    						));
    				} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    N.B. J'aurais pu aussi écrire pour l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    				// 2- on peut INSERER en BDD
    					$pdo_params = array(
    						':nom_id' => $nom_id,
    						':nom' => $nom,
    						':date' => $date,
    						':type_repas' => $type,
    						':inscrit_par' => $inscrit_par,
    						)
    				try {
    					$pdo_insert->execute($pdo_params);
    				} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    Dernière modification par Invité ; 22/08/2019 à 13h29.

  5. #25
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    juste pour attirer votre attention mais ENGINE=MyISAM est obsolète depuis 2009 (dernière version)
    Ce moteur de stockage a été depuis abandonné et n'est plus maintenu depuis 10 ans maintenant.
    Il faut utiliser ENGINE=InnoDb à la place qui est devenu bien plus performant sans compter qu'il apporte des tas de nouvelles fonctionnalités fort utiles.
    Il est présent dans la branche 5.x de MySQL pour des raisons de compatibilité et a été abandonné dans la version 8.x

  6. #26
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    ...Il faut utiliser ENGINE=InnoDb...
    Bien vu.
    D'ailleurs, toutes mes tables SQL sont en InnoDb.

    Mais là, pour mes tests, dans phpMyAdmin en local, il m'a mis MyISAM par défaut *...


    [EDIT]* Pour info, il faut modifier dans le fichier bin/mysql/mysqlxxxxx/my.ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ; The default storage engine that will be used when create new tables
    default-storage-engine=InnoDb
    Dernière modification par Invité ; 22/08/2019 à 15h51.

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Ma table était déjà créée, je suis donc allé vérifier. Le moteur de stockage était en MyISAM, je l'ai donc passé en InnoDB.
    Et j’ai modifié le ini, pour l’avenir.

    J'ai aussi modifié la requête SQL comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $rech_query = "SELECT distinct * 
    	FROM (
    		SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE inscrit_par = :user_id 
    		AND date_repas IN (".$dates_list.") 
    	UNION all 
    		SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE nom_id = :user_id 
    		AND date_repas IN (".$dates_list.")
    		) T
    	ORDER BY date_repas ASC";
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $rech_query = "SELECT nom_id, nom, date_repas, type_repas
    	FROM repas_pris
    	WHERE inscrit_par = :user_id
    	AND date_repas IN (".$dates_list.")
    	ORDER BY date_repas ASC;
    De cette façon, si j'inscris ma collègue, lorsqu'elle se connecte, elle voit les données qui la concernent. Et si elle valide le formulaire, elle écrase le inscrit_par en y mettant son nom, et dès lors, je ne peux plus outrepasser ses choix, puisque je ne les vois plus.

    J’ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php if(date("Y-m-d H:i")>$date." 10:00"){ echo "select.disabled = true;";} ?>
    dans le select en javascript, et le même if pour le remplissage des lignes en provenance de la BDD, pour rendre inactif les liste déroulante des jours passés, et du jour en cours après 10h.
    Ce qui m'a clairement montré que supprimer purement et simplement une ligne venant de la BDD n'est pas une bonne idée.
    Mais cela m'a aussi montré une autre erreur : les champs étant désactivés, leur valeur n'est pas remonté. Du coup, rien n'est modifié en base, ce qui est bien pour ne pas que l'utilisateur se désinscrive, mais qui m'empêche de mettre à jour le champ 'inscrit_par' pour ces enregistrements là. Et du coup, si l'utilisateur inscrit par un collègue change son inscription, le collègue peut une nouvelle fois passer dessus, alors qu'il ne devrait plus avoir le droit.
    Comment puis-je modifier cela ?
    Je pense plus à une modification de la page de traitement. Au lieu de ne pas traiter les lignes avec un $type à 0, il faudrait aller juste updater le champ inscrit_par. Est-ce une solution qui vous parait cohérente ?

    D'avance, merci !

  8. #28
    Invité
    Invité(e)
    Par défaut
    1-
    Citation Envoyé par Helianza Voir le message
    ...J'ai aussi modifié la requête SQL comme suit :...
    En plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $rech_query = "SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE (inscrit_par = :user_id OR nom_id = :user_id)
    		AND date_repas IN (".$dates_list.") 
    	ORDER BY date_repas ASC";
    N.B. A priori, mettre 2 fois :user_id (même nom de "placeholder nommé") ne devrait pas poser de souci.


    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...J’ai rajouté...   ...dans le select en javascript et le code....
    Non.
    Il faut afficher le <select> si condition OK, OU :
    • RIEN pour le JS (ligne ajoutée)
    • nom du type + <input type="hidden" /> pour les lignes récupérées de la BDD




    3-
    ...si j'inscris ma collègue...
    Là, tu vas m'EXPLIQUER comment.
    Car ça suppose de connaitre ses identifiants de connexion (Windows), non ?

    D'autre part, "name.damien" ne me semble pas suffisant pour IDENTIFIER à coup sûr quelqu'un.
    Et s'il y a plusieurs "Damien" ??

    Et c'est justement ICI qu'il serait judicieux d'avoir une table "users" !
    Avec :
    • user_id INT(11) AUTO-INCREMENTE (qui pour le coup est UNIQUE !)
    • user_login (-> celui qu'on appelle jusqu'à présent injustement "user_id"!)
    • user_pwd_hash (éventuellement)
    • nom
    • prenom

    On pourrait aussi y mettre d'autres informations "pertinentes" :
    • tel
    • email
    • intolerances (au lactose, gluten,.....)
    • préférence (végétarien,...)
    Dernière modification par Invité ; 22/08/2019 à 19h04.

  9. #29
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    1-
    En plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $rech_query = "SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE (inscrit_par = :user_id OR nom_id = :user_id)
    		AND date_repas IN (".$dates_list.") 
    	ORDER BY date_repas ASC";
    N.B. A priori, mettre 2 fois :user_id (même nom de "placeholder nommé") ne devrait pas poser de souci.
    Requête corrigée.

    Citation Envoyé par jreaux62 Voir le message
    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...J’ai rajouté...   ...dans le select en javascript et le code....
    Non.
    Il faut afficher le <select> si condition OK, OU :
    • RIEN pour le JS (ligne ajoutée)
    • nom du type + <input type="hidden" /> pour les lignes récupérées de la BDD
    J'avoue qu'ici, je ne comprends pas. Quand je cherche le moyen de désactiver le menu déroulant, on me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select.disabled = true;
    Du coup, je mets cette option en option (^^) avec mon if en php qui me permet de gérer la date. Qu'est-ce qui n'est pas correct ici ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		cell = ligne.insertCell(<?php echo $col; ?>);
    		select = select_modele.cloneNode(true);
    		<?php if(date("Y-m-d H:i")>$date." 10:00"){ echo "select.disabled = true;";} ?> // Ici la ligne que j'ai rajoutée.
    		select.name = 'type['+num_ligne+'][<?php echo $date; ?>]';
    		cell.appendChild( select );
    Et pareil pour le php dans l'affichage des données de la BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    		<td>
    			<select <?php if(date("Y-m-d H:i")>$date." 10:00"){ echo "disabled";} ?> name="type[<?php echo $num_ligne; ?>][<?php echo $date; ?>]" size="1">
    			<!-- On vérifie le choix. S'il n'existe pas => rien, et le choix est par défaut. Sinon, on prend le choix de la BDD.-->
    <?php		// -----
    			foreach( $option_types as $option_value => $option_type )
    			{
    				$option_selected = ( isset($nom_date_type['type'][$date]) && $nom_date_type['type'][$date] == $option_value )? ' selected="selected"' : '';
    ?>
    				<option value="<?php echo $option_value; ?>"<?php echo $option_selected; ?>><?php echo $option_type; ?></option>
    <?php		} ?>
    			</select>
    		</td>

    Citation Envoyé par jreaux62 Voir le message
    3-
    Là, tu vas m'EXPLIQUER comment.
    Car ça suppose de connaitre ses identifiants de connexion (Windows), non ?

    D'autre part, "name.damien" ne me semble pas suffisant pour IDENTIFIER à coup sûr quelqu'un.
    Et s'il y a plusieurs "Damien" ??

    Et c'est justement ICI qu'il serait judicieux d'avoir une table "users" !
    Avec :
    • user_id INT(11) AUTO-INCREMENTE (qui pour le coup est UNIQUE !)
    • user_login (-> celui qu'on appelle jusqu'à présent injustement "user_id"!)
    • user_pwd_hash (éventuellement)
    • nom
    • prenom

    On pourrait aussi y mettre d'autres informations "pertinentes" :
    • tel
    • email
    • intolerances (au lactose, gluten,.....)
    • préférence (végétarien,...)
    La connexion de l'utilisateur n'est là que pour savoir QUI s'inscrit et, le cas échéant, inscrit quelqu'un d'autre. C'est pour ça qu'il faut des identifiants de connexion pour accéder aux inscriptions. Par contre, rajouter un collègue ne se fait pas avec l'authentification. Je demande juste à l'utilisateur qui inscrit de donner l'identifiant "nom.prenom", et j'interroge mon AD pour savoir si la personne existe, et pour pouvoir ensuite transmettre les informations aux RHs, pour le paiement. J'envisage, à terme, d'envoyer un mail à la personne inscrite par un collègue, pour ne pas qu'on puisse dire : "ah mais je ne savais pas que machin m'avait déjà inscrit".
    Ensuite, name.damien est le displayname LDAP, qui interroge mon AD. Donc normalement, si j'ai un autre MONNOMAMOI Damien qui arrive, il aura un autre displayname AD, non ? Du coup, la table utilisateur, je crois n'en avoir pas besoin ici. Surtout que ça obligerait un maintien de la base au gré des arrivées/départs, et vu comment on est averti, au service informatique, ce n'est pas pratique.
    Mon idée serait d'ajouter un autre bouton (donc une autre fonction ?) qui demande à l'utilisateur le nom.prenom du collègue, qui interroge LDAP, puis, si le collègue existe, rajoute la ligne, avec le nom non modifiable, et la possibilité de supprimer la ligne.

    Mais d'abord, je voudrais régler le problème des listes déroulantes grisées.
    Le test que j'ai fait est le suivant :
    - je me suis inscrit, et j'ai inscrit ma collègue Sandra.
    - après reconnexion, je récupère bien mes deux lignes.
    - Sandra se connecte, elle voit bien sa propre ligne uniquement, remplie, avec les premiers jours de la semaine grisés.
    - Elle modifie ses choix, et valide. Normalement, mon souhait ici est que, comme elle change ses choix, la colonne "inscrit_par" soit remplie par elle, afin que je ne puisse plus modifier ses choix après son passage.
    - Sauf que là, les choix grisés sont inactifs, et donc, ils ne sont pas pris en compte. Du coup, jeudi et vendredi sont bien dans la BDD avec inscrit_par Sandra, mais lundi, mardi et mercredi sont toujours en base avec inscrit_par Damien.
    - Du coup, quand je me reconnecte, je retrouve les bons choix de début de semaine, grisés. Par contre, jeudi et vendredi sont considérés comme vide pour moi, puisque la colonne inscrit_par contient Sandra.
    - Et de ce fait, je peux modifier les choix non grisés de Sandra, alors que je ne devrais plus.

    Est-il possible de faire en sorte que l'appui sur le "OK" dégrise les menus déroulants grisés avant traitement par la page du formulaire ?
    Est-il possible de rajouter un bouton dans la dernière colonne du tableau pour les données provenant de la base de données, afin de mettre tous les menus déroulants non inactifs au choix 0, "Non inscrit" ?

  10. #30
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Listes déroulantes : je t'ai dit comment faire.

    Citation Envoyé par jreaux62 Voir le message
    Il faut afficher le <select> si condition OK, OU :
    • RIEN pour le JS (ligne ajoutée)
    • nom du type + <input type="hidden" /> pour les lignes récupérées de la BDD
    D'autre part, if(date("Y-m-d H:i")>$date." 10:00") : ce n'est pas comme ça qu'on compare des dates.
    On utilise DateTime.

    Ce qui donne :

    1- script JS (tout) :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    	<script>
    	"use strict";
    	let num_ligne = <?php echo count($nom_date_types); ?>; // variable globale
     
    	function entierAleatoire(min, max)
    	{
    		return Math.floor(Math.random() * (max - min + 1)) + min;
    	}
     
    	// Fonction pour insérer une ligne en fin de tableau
    	function insererLigne_Fin()
    	{
    		let cell, ligne, input, select_modele, select, option, button;
     
    		// on récupère l'identifiant (id) de la table qui sera modifiée
    		let tableau = document.getElementById("InsTable");
    		ligne = tableau.insertRow(-1); // création d'une ligne pour ajout en fin de table
     
    		// création et insertion des cellules dans la nouvelle ligne créée
    <?php   // ---------
                    $col = 0;
    ?>
    		// ---------
    		// Première cellule : nom + nom_id
    		cell = ligne.insertCell(<?php echo $col; ?>);
     
    		// <input type="text"> permettant d'écrire le NOM de l'invité
    		input = document.createElement('input');
    		input.type = 'text';
    		input.name = 'nom['+num_ligne+']';
    		input.value = 'Invité '+num_ligne; // nom par défaut
    		cell.appendChild( input );
     
    		// <input type="hidden"> permettant d'IDENTIFIER l'invité (dans la table de la BDD)
    		input = document.createElement('input');
    		input.type = 'hidden';
    		input.name = 'nom_id['+num_ligne+']';
    		input.value = 'invite_<?php echo time(); ?>_'+entierAleatoire(1000, 9999); // IDENTIFIANT unique
    		cell.appendChild( input );
     
    		// ---------
    		// Cellules suivantes : jours
    		// on crée d'abord un <select> (modèle) avec <options> (qui sont les mêmes partout)
    		select_modele = document.createElement('select');
    <?php   // ---------
                    // construction dynamique des <option> depuis l'array $option_types
                    foreach( $option_types as $option_value => $option_type )
                    {
    ?>
                    option = document.createElement('option');
                    option.value = '<?php echo htmlspecialchars($option_value); ?>';
    		option.textContent = '<?php echo htmlspecialchars($option_type); ?>';
    		select_modele.appendChild( option );
     
    <?php   } ?>
    		// ---------
    		// on met un clone du <select> (modèle) avec <options> dans les cellules du tableau
    <?php   // ---------
                    $datetime_now = new DateTime(); // maintenant
                    // ---------
                    // Pour chaque Date (= Cellule du tableau) dans l'array $dates_array
                    foreach( $dates_array as $date )
                    {
                            $col++; // 1 à 10
    ?>
                    cell = ligne.insertCell(<?php echo $col; ?>);
    <?php           // -----
                            // Si la Date est APRES aujourd'hui à 10h00
                            $datetime_date = new DateTime($date.' 10:00'); // date à 10h
                            if( $datetime_date > $datetime_now )
                            {
    ?>
    		select = select_modele.cloneNode(true);
    		select.name = 'type['+num_ligne+'][<?php echo $date; ?>]';
    		cell.appendChild( select );
     
    <?php           } else {
                                    // (sinon : rien)
                            }
                    } 
                            $col++; // 11
    ?>
    		// ---------
    		// Dernière cellule : X
    		cell = ligne.insertCell(<?php echo $col; ?>);
    		button = document.createElement('button');
    		button.type = 'button';
    		button.title = 'Supprimer la ligne';
    		button.textContent = 'X';
    		button.addEventListener	( // le bouton "X" supprime toute la ligne <tr>
    			"click", function(e){
    				tableau.children[1].removeChild(e.target.parentElement.parentElement); // tableau.children[1] = <tbody>
    				e.preventDefault();
    			}
    		);
    		cell.appendChild( button );
     
    		// ---------
    		num_ligne++; // on incrémente la variable globale
    	}
       </script>

    2- <table> (<tbody>) :
    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
    	<tbody>
    <?php
    // ---------
    $datetime_now = new DateTime();	// maintenant
    // ---------
    // Affichage
    $num_ligne = 0;
    foreach( $nom_date_types as $nom_id => $nom_date_type )
    {
    ?>
    	<tr>
    		<td>
    <?php 		if( $nom_id == $user_id ){ ?>
    			<?php echo $nom_date_type['nom']; ?>
    			<input type="hidden" name="nom[<?php echo $num_ligne; ?>]" value="<?php echo $nom_date_type['nom']; ?>" />
    <?php		} else { ?>
    			<input type="text" name="nom[<?php echo $num_ligne; ?>]" value="<?php echo $nom_date_type['nom']; ?>" />
    <?php		} ?>
    			<input type="hidden" name="nom_id[<?php echo $num_ligne; ?>]" value="<?php echo $nom_id; ?>" />
    		</td>
    <?php	// Pour chaque Date
    		foreach( $dates_array as $date )
    		{
    ?>
    		<td>
    <?php		// -----
    			// Si la Date est APRES aujourd'hui à 10h00
    			$datetime_date = new DateTime($date.' 10:00'); // date à 10h
    			if( $datetime_date > $datetime_now )
    			{
    ?>
    			<select name="type[<?php echo $num_ligne; ?>][<?php echo $date; ?>]" size="1">
    <?php			// -----
    				foreach( $option_types as $option_value => $option_type )
    				{
    				$option_selected = ( isset($nom_date_type['type'][$date]) && $nom_date_type['type'][$date] == $option_value )? ' selected="selected"' : '';
    ?>
    				<option value="<?php echo $option_value; ?>"<?php echo $option_selected; ?>><?php echo $option_type; ?></option>
    <?php			} ?>
    			</select>
    <?php		} else { ?>
    			<?php echo ( isset($nom_date_type['type'][$date]) )? '<em>'.$option_types[$nom_date_type['type'][$date]].'</em>' : ''; ?>
    			<input type="hidden" name="type[<?php echo $num_ligne; ?>][<?php echo $date; ?>]" value="<?php echo ( isset($nom_date_type['type'][$date]) )? $nom_date_type['type'][$date] : ''; ?>" />
    <?php		} ?>
    		</td>
    <?php
    		}
    		// ---------
    		if( $num_ligne == 0 ){ // (on ne peut pas supprimer la 1ere ligne)
    ?>
    		<td>&nbsp;</td>
    <?php	} else { ?>
    		<td>
    			<button type="button" onclick="document.getElementById('InsTable').children[1].removeChild(this.parentElement.parentElement);" title="Supprimer la ligne">X</button>
    		</td>
    <?php	} 
    		// ---------
    		$num_ligne++;
    ?>
    	</tr>
    <?php
    }
    // ---------
    ?>
    	</tbody>

  11. #31
    Invité
    Invité(e)
    Par défaut
    Tu remarqueras aussi dans le code précédent que j'ai ajouté un bouton "X" sur les lignes du tableau, existants en BDD (sauf la 1ère) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		<td>
    			<button type="button" onclick="document.getElementById('InsTable').children[1].removeChild(this.parentElement.parentElement);" title="Supprimer la ligne">X</button>
    		</td>
    Du coup, il faut modifier le code de TRAITEMENT comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
    // -----------------------------------------------
    // connexion à la BDD
    // ..........
     
    // -----------------------------------------------
    // array des dates du lundi au vendredi, pour la semaine en cours et la semaine suivante
    function get_array_dates_lundi_vendredi_sur2semaines()
    {
    	$dates = array();
    	$year = date('Y');	// cette année
    	$week = date('W');	// cette semaine
    	for( $i=1; $i<6; $i++ ) // 1 à 5 (lundi à vendredi) (0=dimanche)
    	{
    		$date = new DateTime();
    		$date->setISOdate($year, $week, $i);	// semaine en cours
    		$dates[] = $date->format('Y-m-d');
    		$date->setISOdate($year, $week+1, $i);	// semaine suivante
    		$dates[] = $date->format('Y-m-d');
    	}
    	sort($dates);
    	return $dates;
    }
    // -----------------
    $dates_array = get_array_dates_lundi_vendredi_sur2semaines();
    // -----------------------------------------------
    // TRAITEMENT
    // -----------------
    if( isset($_POST['validerTableau']) )
    {
    //	var_dump( $_POST ); // TEST
    	// -----------------
    	// 0- Récupération des données du formulaire
    	$inscrit_par = $_POST['inscrit_par']; // COMMUN à tous
    	// ---------
    	$nom_array = $_POST['nom']; // array
    	$nom_id_array = $_POST['nom_id']; // array
    	$date_type_array = $_POST['type']; // array
     
    	// -----------------
    	// 1- DELETE : on supprime d'abord pour CES DATES, et CE 'nom_id' OU CE 'inscrit_par'
    	// ---------
    	$pdo_params = array();
    	$pdo_params[':nom_id'] = $inscrit_par;
    	$pdo_params[':inscrit_par'] = $inscrit_par;
    	$dates_list = array();
    	foreach( $dates_array as $idx => $date ){
    		$pdo_params[':date'.$idx] = $date;
    		$dates_list[] = ':date'.$idx;
    	}
    	$dates_list = implode(',',$dates_list);	// chaine de la forme :date0,:date1,:date2,...
    	// ---------
    	$delete_query = "DELETE FROM repas_pris
    		WHERE (nom_id = :nom_id OR inscrit_par = :inscrit_par) 
    		AND date IN (".$dates_list.");";
    	try {
    		$pdo_delete = $pdo->prepare($delete_query);
    		$pdo_delete->execute($pdo_params);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
     
    	// -----------------
    	// 2- INSERT - PREPARATION (AVANT les boucles foreach)
    	$insert_query = "INSERT INTO repas_pris
    		(nom_id, nom, date, type_repas, inscrit_par) 
    		VALUES
    		(:nom_id, :nom, :date, :type_repas, :inscrit_par) ;";
    	try {
    		$pdo_insert = $pdo->prepare($insert_query);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    	// ---------
    	// Pour chaque ligne du tableau
    	foreach( $nom_id_array as $idx => $nom_id )
    	{
    		$nom = $nom_array[$idx];
    	//	echo '<p>nom : '.$nom.' ('.$nom_id.')</p>';	// TEST
    		foreach( $date_type_array[$idx] as $date => $type )
    		{
    			// 2- on n'INSERT QUE les dates où type != 0
    			if( !empty($type) )
    			{ 
    	//			echo '<p>date : '.$date.' - type : '.$type.'</p>'; 	// TEST
    				// 2- INSERT en BDD
    				try {
    					$pdo_insert->execute(array(
    						':nom_id' => $nom_id,
    						':nom' => $nom,
    						':date' => $date,
    						':type_repas' => $type,
    						':inscrit_par' => $inscrit_par,
    						));
    				} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    			}
    		}
    	}
    	// -----------------
    }
    A NOTER :
    • Toutes les fonctions (comme get_array_dates_lundi_vendredi_sur2semaines()) peuvent être dans un fichier externe, puis appelées en include ou require.
    • Idem pour le script de connexion à la base de données (voir : "connexion PDO - encodage UTF-8")

    Car c'est inutile (voire contre-productif) de copier plusieurs fois les mêmes choses.

  12. #32
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Listes déroulantes : je t'ai dit comment faire.
    Au temps pour moi, je cherchais une solution avec une liste déroulante grisée, qui, je trouve, montre bien que l'inscription est bloquée.
    Mais la solution que vous proposez est bien plus élégante. Je vais essayer de modifier la couleur du fond, pour mettre un gris léger.


    Citation Envoyé par jreaux62 Voir le message
    Tu remarqueras aussi dans le code précédent que j'ai ajouté un bouton "X" sur les lignes du tableau, existants en BDD (sauf la 1ère) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		<td>
    			<button type="button" onclick="document.getElementById('InsTable').children[1].removeChild(this.parentElement.parentElement);" title="Supprimer la ligne">X</button>
    		</td>
    Du coup, il faut modifier le code de TRAITEMENT comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
    // -----------------------------------------------
    // connexion à la BDD
    // ..........
     
    // -----------------------------------------------
    // array des dates du lundi au vendredi, pour la semaine en cours et la semaine suivante
    function get_array_dates_lundi_vendredi_sur2semaines()
    {
    	$dates = array();
    	$year = date('Y');	// cette année
    	$week = date('W');	// cette semaine
    	for( $i=1; $i<6; $i++ ) // 1 à 5 (lundi à vendredi) (0=dimanche)
    	{
    		$date = new DateTime();
    		$date->setISOdate($year, $week, $i);	// semaine en cours
    		$dates[] = $date->format('Y-m-d');
    		$date->setISOdate($year, $week+1, $i);	// semaine suivante
    		$dates[] = $date->format('Y-m-d');
    	}
    	sort($dates);
    	return $dates;
    }
    // -----------------
    $dates_array = get_array_dates_lundi_vendredi_sur2semaines();
    // -----------------------------------------------
    // TRAITEMENT
    // -----------------
    if( isset($_POST['validerTableau']) )
    {
    //	var_dump( $_POST ); // TEST
    	// -----------------
    	// 0- Récupération des données du formulaire
    	$inscrit_par = $_POST['inscrit_par']; // COMMUN à tous
    	// ---------
    	$nom_array = $_POST['nom']; // array
    	$nom_id_array = $_POST['nom_id']; // array
    	$date_type_array = $_POST['type']; // array
     
    	// -----------------
    	// 1- DELETE : on supprime d'abord pour CES DATES, et CE 'nom_id' OU CE 'inscrit_par'
    	// ---------
    	$pdo_params = array();
    	$pdo_params[':nom_id'] = $inscrit_par;
    	$pdo_params[':inscrit_par'] = $inscrit_par;
    	$dates_list = array();
    	foreach( $dates_array as $idx => $date ){
    		$pdo_params[':date'.$idx] = $date;
    		$dates_list[] = ':date'.$idx;
    	}
    	$dates_list = implode(',',$dates_list);	// chaine de la forme :date0,:date1,:date2,...
    	// ---------
    	$delete_query = "DELETE FROM repas_pris
    		WHERE (nom_id = :nom_id OR inscrit_par = :inscrit_par) 
    		AND date IN (".$dates_list.");";
    	try {
    		$pdo_delete = $pdo->prepare($delete_query);
    		$pdo_delete->execute($pdo_params);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
     
    	// -----------------
    	// 2- INSERT - PREPARATION (AVANT les boucles foreach)
    	$insert_query = "INSERT INTO repas_pris
    		(nom_id, nom, date, type_repas, inscrit_par) 
    		VALUES
    		(:nom_id, :nom, :date, :type_repas, :inscrit_par) ;";
    	try {
    		$pdo_insert = $pdo->prepare($insert_query);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    	// ---------
    	// Pour chaque ligne du tableau
    	foreach( $nom_id_array as $idx => $nom_id )
    	{
    		$nom = $nom_array[$idx];
    	//	echo '<p>nom : '.$nom.' ('.$nom_id.')</p>';	// TEST
    		foreach( $date_type_array[$idx] as $date => $type )
    		{
    			// 2- on n'INSERT QUE les dates où type != 0
    			if( !empty($type) )
    			{ 
    	//			echo '<p>date : '.$date.' - type : '.$type.'</p>'; 	// TEST
    				// 2- INSERT en BDD
    				try {
    					$pdo_insert->execute(array(
    						':nom_id' => $nom_id,
    						':nom' => $nom,
    						':date' => $date,
    						':type_repas' => $type,
    						':inscrit_par' => $inscrit_par,
    						));
    				} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    			}
    		}
    	}
    	// -----------------
    }
    Comme je le disais dans le message #27 : en fait, supprimer une ligne qui vient de la BDD n'est pas une bonne idée, car je perds les informations des inscriptions passées. C'est pour ça que je préfère l'idée de remettre les select en option 1, non inscrit. Mais je ne sais pas si c'est possible.
    L'autre solution, que je pense plus facile, consiste à refaire la comparaison de date/heure avant le delete, dans le fichier de traitement, et de supprimer de l'array $date_type_array les dates qui ne sont plus à modifier.
    Je vais regarder cela.

    J'en profite pour poser une question sur les dates. Vous me dites que ce n'est pas comme cela que l'on fait. Est-ce qu'il y a un intérêt à votre méthode, autre que celle de faire un code plus joli ou propre ? Ici, vous utilisez 2 nouvelles variables, est-ce que ce n'est pas moins efficace, en temps et ressource ? Je sais qu'ici, c'est négligeable, mais pour de plus gros projets ?
    Ou bien est-ce que la comparaison que je fais ne fonctionne que parce que je suis dans un cas précis ? Merci.

    Citation Envoyé par jreaux62 Voir le message
    A NOTER :
    • Toutes les fonctions (comme get_array_dates_lundi_vendredi_sur2semaines()) peuvent être dans un fichier externe, puis appelées en include ou require.
    • Idem pour le script de connexion à la base de données (voir : "connexion PDO - encodage UTF-8")

    Car c'est inutile (voire contre-productif) de copier plusieurs fois les mêmes choses.
    En effet. Je vais m'atteler à cela.
    Quelle est la norme, pour ce genre de choses ? Un fichier qui contient toutes les fonctions ? Un fichier par fonction ? Par groupes de fonction ?

  13. #33
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Helianza Voir le message
    ...en fait, supprimer une ligne qui vient de la BDD n'est pas une bonne idée, car je perds les informations des inscriptions passées.
    L'autre solution ... consiste à refaire la comparaison de date/heure avant le delete, dans le fichier de traitement, et de supprimer de l'array $date_type_array les dates qui ne sont plus à modifier.
    Bien vu ! Je n'y avais pas pensé...

    Bon. Comme on aura besoin de ces "dates valides" plusieurs fois, autant créer une fonction :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // -----------------
    function get_array_dates_lundi_vendredi_sur2semaines_valides( $dates_array )
    {
    	$datetime_now = new DateTime();	// maintenant
    	$dates_valides = array();
    	// -----
    	foreach( $dates_array as $idx => $date ){
    		// -----
    		$datetime_date = new DateTime($date.' 10:00'); // date à 10h
    		// Si la Date est APRES aujourd'hui à 10h00
    		if( $datetime_date > $datetime_now )
    		{
    			$dates_valides[$idx] = $date;
    		}
    	}
    	// -----
    	return $dates_valides;
    }
    // -----------------
    On aura alors :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $dates_array = get_array_dates_lundi_vendredi_sur2semaines();
    $dates_array_valides = get_array_dates_lundi_vendredi_sur2semaines_valides( $dates_array );

    Par conséquent, il suffira de vérifier :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach( $dates_array as $idx => $date )
    {
    	if( in_array( $date, $dates_array_valides) ) // OK, date valide
    	{
    ...
    Voir : in_array()
    Dernière modification par Invité ; 23/08/2019 à 20h25.

  14. #34
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Merci pour les retours et l'aide apportée.

    Voici les fichiers que j'ai maintenant.

    Le fichier _connexion.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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    // -----------------
    //Connexion à MySql Par Damien :D
    /*try
    {
    	$pdo = new PDO('mysql:host=localhost;dbname=festin;charset=utf8', 'root', '');
    }
    catch (Exception $e)
    {
    		die('Erreur : ' . $e->getMessage());
    }*/
     
    // © Jérome Réaux : http://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
    // ------------------------------------------------------------
    // Connection à la Base de Données
    // ------------------------------------------------------------
    if( !function_exists('my_pdo_connexxion') )
    {
    	function my_pdo_connexxion()
    	{
    		// ---------
    		$hostname	= 'localhost'; 		// voir hébergeur ou "localhost" en local
    		$database	= 'festin'; 		// nom de la BdD
    		$username	= 'root'; 			// identifiant "root" en local
    		$password	= ''; 				// mot de passe (vide en local)
    		// ---------
    		// connexion à la Base de Données
    		try {
    			// chaine de connexion (DSN)
    			$strConn 	= 'mysql:host='.$hostname.';dbname='.$database.';charset=utf8';	// UTF-8
    			$extraParam	= array(
    				PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,		// rapport d'erreurs sous forme d'exceptions
    				PDO::ATTR_PERSISTENT => true, 						// Connexions persistantes
    				PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 	// fetch mode par defaut
    				PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"	// encodage UTF-8
    				);
    			// Instancie la connexion
    			$pdo = new PDO($strConn, $username, $password, $extraParam);
    			return $pdo;
    		}
    		// ---------
    		catch(PDOException $e){
    			$msg = 'ERREUR PDO connexion...' . $e->getMessage(); die($msg);
    			return false;
    		}
    		// ---------
    	}
    }
    // --------------------------------
    $pdo	= my_pdo_connexxion();
    // --------------------------------------------------------------
    ?>
    J'avais fait une simple copie de mon fichier, et cela fonctionnait. Mais j'ai repris, pour la fonctionnalité, le fichier que vous proposez.

    Le fichier _function.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
    44
    45
    <?php
    // -------------------------------------------------------------------------------------
    // array des dates du lundi au vendredi, pour la semaine en cours et la semaine suivante
    function get_array_dates_lundi_vendredi_sur2semaines()
    {
    	$dates = array();
    	$year = date('Y');	// cette année
    	$week = date('W');	// cette semaine
    	for( $i=1; $i<6; $i++ ) // 1 à 5 (lundi à vendredi) (0=dimanche)
    	{
    		$date = new DateTime();
    		$date->setISOdate($year, $week, $i);	// semaine en cours
    		$dates[] = $date->format('Y-m-d');
    		$date->setISOdate($year, $week+1, $i);	// semaine suivante
    		$dates[] = $date->format('Y-m-d');
    	}
    	sort($dates);
    	return $dates;
    }
    // Fin de la fonction array de dates
    // -------------------------------------------------------------------------------------
     
    // -------------------------------------------------------------------------------------
    // array des dates du lundi au vendredi, pour la semaine en cours et la semaine suivante
    // sans les dates qu'il ne faut pas mettre à jour
    function get_array_dates_lundi_vendredi_sur2semaines_valides( $dates_array )
    {
    	$datetime_now = new DateTime();	// maintenant
    	$dates_valides = array();
    	// -----
    	foreach( $dates_array as $idx => $date ){
    		// -----
    		$datetime_date = new DateTime($date.' 10:00'); // date à 10h
    		// Si la Date est APRES aujourd'hui à 10h00
    		if( $datetime_date > $datetime_now )
    		{
    			$dates_valides[$idx] = $date;
    		}
    	}
    	// -----
    	return $dates_valides;
    }
    // Fin de la fonction array de dates valides
    // -------------------------------------------------------------------------------------
    ?>
    Le fichier inscription.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
    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
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    <?php if( empty(session_id()) ){ session_start(); }
    header('Content-type:text/html; charset=UTF-8');	// encodage UTF-8
    // Pour voir toutes les erreurs. Il faut absolument le commenter en production
    error_reporting(E_ALL); 	// en TEST !!
    // -----------------------------------------------
    include('_connexion.php');
    include('_function.php');
     // Connexion à LDAP
    $ad_host="192.168.5.101";
    $ad_port="389";
    $dn_base_ad="DC=sonnenhof,DC=local"; 
    $suffixe = "@sonnenhof.local"; 
    $user_id=$_POST['user'];
    $password=$_POST['mdp'];
    $ldaptree = "OU=Sonnenhof v2,DC=sonnenhof,DC=local";
    $ldapsearch = "(sAMAccountName=$user_id)";
    $ldapattributes = array("displayname", "mail", "sAMAccountName", "givenname", "fullname", "sn");
    $connexion_ok=false;
     
     
    //Connexion au serveur LDAP
    $ad = ldap_connect($ad_host, $ad_port) or die('Could not connect to LDAP server.');
    ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
     
    if (!@ldap_bind($ad, $user_id.$suffixe, $password)) 
    {
    	//Vérification des informations de connexion
    	$erreur =  ldap_errno($ad);	
     
    	if($erreur==49) 
    	{
    		echo "Les informations saisies sont erronées.<br>";
    		header ('location: index.php');
    	} 
    	elseif ($erreur==-1)
    	{
    		echo "Problème de réseau - merci de contacter le service informatique.<br>";
    		header ('location: index.php');
    	} 
    }
    else 
    {
    	$connexion_ok=true;
    }
    if ($connexion_ok)
    {
    	//Recherche LDAP
    	$result = ldap_search($ad,$ldaptree,$ldapsearch,$ldapattributes) or die ("Error in search query: ".ldap_error($ad));
        $data = ldap_get_entries($ad, $result);
    	$user_nom = $data[0]['displayname'][0];
    }
    ldap_unbind($ad);
     
     
    // --------------------------------------------------------------
    // Pour tester, si je n'ai pas l'accès LDAP ni la connexion MySQL
    // $user_nom = $data[0]['displayname'][0];	// TEST
    // $user_id = "meyer.damien"; //TEST
    // --------------------------------------------------------------
     
    // On crée notre variable qui contient un tableau avec nos dix dates
    $dates_array = get_array_dates_lundi_vendredi_sur2semaines();
    //var_dump( $dates_array );	// TEST
     
    // ------------------------------------------
    // Requête pour cet utilisateur, et ces dates
    // On crée nos paramètres. Tableau contenant l'user_id (l'utilisateur connecté), et les 10 dates des deux semaines
    $pdo_params = array();
    $pdo_params[':user_id'] = $user_id;
    $dates_list = array();
    foreach( $dates_array as $idx => $date ){
    	$pdo_params[':date'.$idx] = $date;
    	$dates_list[] = ':date'.$idx;
    }
    //var_dump($pdo_params); // TEST
    $dates_list = implode(',',$dates_list);	// chaine de la forme :date0,:date1,:date2,...
    //var_dump($dates_list); //TEST
     
    // On crée nos requêtes. On récupère les gens inscrit_par l'utilisateur connecté, ainsi que les infos pour l'utilisateur connecté (avec un distinct pour éviter les doublons)
    $rech_query = "SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE (inscrit_par = :user_id OR nom_id = :user_id)
    		AND date_repas IN (".$dates_list.") 
    	ORDER BY date_repas ASC";
     
    /*
    $rech_query = "SELECT distinct * 
    	FROM (
    		SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE inscrit_par = :user_id 
    		AND date_repas IN (".$dates_list.") 
    	UNION all 
    		SELECT nom_id, nom, date_repas, type_repas 
    		FROM repas_pris 
    		WHERE nom_id = :user_id 
    		AND date_repas IN (".$dates_list.")
    		) T
    	ORDER BY date_repas ASC";
    
    "SELECT nom_id, nom, date_repas, type_repas
    	FROM repas_pris
    	WHERE inscrit_par = :user_id
    	AND date_repas IN (".$dates_list.")
    	ORDER BY date_repas ASC;";
    	*/
     
    try {
    	// On prépare la requête, puis on l'exécute avec les paramètres créés avant
    	$pdo_select = $pdo->prepare($rech_query);
    	$pdo_select->execute($pdo_params);
    	$rech_rowAll = $pdo_select->fetchAll();	// récupère toutes les lignes
    } catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    // ---------
    // on crée un array des types par date et par nom_id
    $nom_date_types	= array();
    $nom_date_types[$user_id]['nom'] = $user_nom;
    $nom_date_types[$user_id]['type'] = array();
    foreach( $rech_rowAll as $row )
    {
    	$nom_date_types[$row['nom_id']]['nom'] = $row['nom'];
    	$nom_date_types[$row['nom_id']]['type'][$row['date_repas']] = $row['type_repas'];
    }
    //var_dump($nom_date_types); // TEST
    // ---------
    // options pour les select (qui sont les mêmes partout)
    $option_types = array(
    	//0 => 'Non inscrit',
    	0 => 'Non inscrit',
    	1 => 'Menu Normal',
    	2 => 'Menu Alternatif'
    );
    //	var_dump( $option_types ); // TEST
    // -----------------
    //	var_dump( $_POST ); // TEST
    // -----------------
    ?>
    <!DOCTYPE html>
    <html>
     <head>
     <link rel="stylesheet" href="style.css" />
       <title>Inscription au Festin</title>
     
    <script>
    	"use strict";
    	let num_ligne = <?php echo count($nom_date_types); ?>; // variable globale
     
    	function entierAleatoire(min, max)
    	{
    		return Math.floor(Math.random() * (max - min + 1)) + min;
    	}
     
    	// Fonction pour insérer une ligne en fin de tableau
    	function insererLigne_Fin()
    	{
    		let cell, ligne, input, select_modele, select, option, button;
     
    		// on récupère l'identifiant (id) de la table qui sera modifiée
    		let tableau = document.getElementById("InsTable");
    		ligne = tableau.insertRow(-1); // création d'une ligne pour ajout en fin de table
     
    		// création et insertion des cellules dans la nouvelle ligne créée
    <?php   // ---------
                    $col = 0;
    ?>
    		// ---------
    		// Première cellule : nom + nom_id
    		cell = ligne.insertCell(<?php echo $col; ?>);
     
    		// <input type="text"> permettant d'écrire le NOM de l'invité
    		input = document.createElement('input');
    		input.type = 'text';
    		input.name = 'nom['+num_ligne+']';
    		input.value = 'Invité '+num_ligne; // nom par défaut
    		cell.appendChild( input );
     
    		// <input type="hidden"> permettant d'IDENTIFIER l'invité (dans la table de la BDD)
    		input = document.createElement('input');
    		input.type = 'hidden';
    		input.name = 'nom_id['+num_ligne+']';
    		input.value = 'invite_<?php echo time(); ?>_'+entierAleatoire(1000, 9999); // IDENTIFIANT unique
    		cell.appendChild( input );
     
    		// ---------
    		// Cellules suivantes : jours
    		// on crée d'abord un <select> (modèle) avec <options> (qui sont les mêmes partout)
    		select_modele = document.createElement('select');
    <?php   // ---------
                    // construction dynamique des <option> depuis l'array $option_types
                    foreach( $option_types as $option_value => $option_type )
                    {
    ?>
                    option = document.createElement('option');
                    option.value = '<?php echo htmlspecialchars($option_value); ?>';
    		option.textContent = '<?php echo htmlspecialchars($option_type); ?>';
    		select_modele.appendChild( option );
     
    <?php   } ?>
    		// ---------
    		// on met un clone du <select> (modèle) avec <options> dans les cellules du tableau
    <?php   // ---------
                    $datetime_now = new DateTime(); // maintenant
                    // ---------
                    // Pour chaque Date (= Cellule du tableau) dans l'array $dates_array
                    foreach( $dates_array as $date )
                    {
                            $col++; // 1 à 10
    ?>
                    cell = ligne.insertCell(<?php echo $col; ?>);
    <?php           // -----
                            // Si la Date est APRES aujourd'hui à 10h00
                            $datetime_date = new DateTime($date.' 10:00'); // date à 10h
                            if( $datetime_date > $datetime_now )
                            {
    ?>
    		select = select_modele.cloneNode(true);
    		select.name = 'type['+num_ligne+'][<?php echo $date; ?>]';
    		cell.appendChild( select );
     
    <?php           } else {
                                    // (sinon : rien)
    ?>
    						cell.style.backgroundColor = "#DCDCDC";
    <?php
                            }
                    } 
                            $col++; // 11
    ?>
    		// ---------
    		// Dernière cellule : X
    		cell = ligne.insertCell(<?php echo $col; ?>);
    		button = document.createElement('button');
    		button.type = 'button';
    		button.title = 'Supprimer la ligne';
    		button.textContent = 'X';
    		button.addEventListener	( // le bouton "X" supprime toute la ligne <tr>
    			"click", function(e){
    				tableau.children[1].removeChild(e.target.parentElement.parentElement); // tableau.children[1] = <tbody>
    				e.preventDefault();
    			}
    		);
    		cell.appendChild( button );
     
    		// ---------
    		num_ligne++; // on incrémente la variable globale
    	}
       </script>
    </head>
    <body>
         <?php
    	//Résultats
    	print "Bonjour ".$data[0]['givenname'][0]." !<br><br>J'ai bien l'impression que tu as faim. Inscris-toi !<br><br>";
    ?>
       <section>
    	<form action="valider.php" method="post">
     
    			<input type="hidden" name="inscrit_par" value="<?php echo $user_id; ?>" />
     
    	<table id="InsTable" border="1">
    	<thead>
    	<tr>
    		<th>Nom</th>
    <?php	// ---------
    		// On remplit la première ligne avec les jours des semaines courante et suivante
    		foreach( $dates_array as $date )
    		{
    			// le IF ici sert à colorer l'arrière plan en gris, quand la date est passée.
    			// à remplacer par du CSS
    			$datetime_date = new DateTime($date.' 10:00'); // date à 10h
    			if( $datetime_date > $datetime_now )
    			{
    ?>
    		<th>
     
    			<?php 
    			} else {
    				?>
    				<th  scope="col">
    			<?php }
    			setlocale(LC_ALL, 'fr_FR'); // Dates en Français
    			echo utf8_encode(strftime('%A', strtotime($date))).'<br />'.utf8_encode(strftime('%#d %b %Y', strtotime($date))); 
    			?>
    		</th>
    <?php
    		}
    		// ---------
    ?>
    		<th>&nbsp;</th>
    	</tr>
    	</thead>
    		<tbody>
    <?php
    // ---------
    $datetime_now = new DateTime();	// maintenant
    // ---------
    // Affichage
    $num_ligne = 0;
    foreach( $nom_date_types as $nom_id => $nom_date_type )
    {
    ?>
    	<tr>
    		<td>
    <?php 		if( $nom_id == $user_id ){ ?>
    			<?php echo $nom_date_type['nom']; ?>
    			<input type="hidden" name="nom[<?php echo $num_ligne; ?>]" value="<?php echo $nom_date_type['nom']; ?>" />
    <?php		} else { ?>
    			<input type="text" name="nom[<?php echo $num_ligne; ?>]" value="<?php echo $nom_date_type['nom']; ?>" />
    <?php		} ?>
    			<input type="hidden" name="nom_id[<?php echo $num_ligne; ?>]" value="<?php echo $nom_id; ?>" />
    		</td>
    <?php	// Pour chaque Date
    		foreach( $dates_array as $date )
    		{
    ?>
    		<!-- <td> passé dans le IF, pour gérer le gris de l'arrière plan.
    		A remplacer par du CSS quand je saurais comment faire -->
    <?php		// -----
    			// Si la Date est APRES aujourd'hui à 10h00
    			$datetime_date = new DateTime($date.' 10:00'); // date à 10h
    			if( $datetime_date > $datetime_now )
    			{
    ?>
    			<td>
    			<select name="type[<?php echo $num_ligne; ?>][<?php echo $date; ?>]" size="1">
    <?php			// -----
    				foreach( $option_types as $option_value => $option_type )
    				{
    				$option_selected = ( isset($nom_date_type['type'][$date]) && $nom_date_type['type'][$date] == $option_value )? ' selected="selected"' : '';
    ?>
    				<option value="<?php echo $option_value; ?>"<?php echo $option_selected; ?>><?php echo $option_type; ?></option>
    <?php			} ?>
    			</select>
    <?php		} else { ?>
    			<td scope="col">
    			<?php echo ( isset($nom_date_type['type'][$date]) )? $option_types[$nom_date_type['type'][$date]] : ''; ?>
    			<input type="hidden" name="type[<?php echo $num_ligne; ?>][<?php echo $date; ?>]" value="<?php echo ( isset($nom_date_type['type'][$date]) )? $nom_date_type['type'][$date] : ''; ?>" />
    <?php		} ?>
    		</td>
    <?php
    		}
    		// ---------
    		if( $num_ligne == 0 ){ // (on ne peut pas supprimer la 1ere ligne)
    ?>
    		<td>&nbsp;</td>
    <?php	} else { ?>
    		<td>
    			<button type="button" onclick="document.getElementById('InsTable').children[1].removeChild(this.parentElement.parentElement);" title="Supprimer la ligne">X</button>
    		</td>
    <?php	} 
    		// ---------
    		$num_ligne++;
    ?>
    	</tr>
    <?php
    }
    // ---------
    ?>
    	</tbody>
    	</table>
    	<p><button type="button" onclick="insererLigne_Fin();">+ Ajouter un invité</button>
    	<button type="button" onclick="insererCollegue();">+ Ajouter un collègue</button></p>
    	<p><input type="submit" name="validerTableau" value="OK" /></p>
     
    	</form>
     
    	<p><a href="index.php">Revenir à la page de login</a></p>
     
       </section>
     
    </body>
    </html>
    Et le fichier valider.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
    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
    <!DOCTYPE html>
    <html>
     <head>
       <title>Inscription au Festin</title>
     </head>
     <body>
    <?php
    include('_connexion.php');
    include('_function.php');
    // -----------------
    $dates_array = get_array_dates_lundi_vendredi_sur2semaines();
    $dates_array_valides = get_array_dates_lundi_vendredi_sur2semaines_valides($dates_array);
    // -----------------------------------------------
    // TRAITEMENT
    // -----------------
    if( isset($_POST['validerTableau']) )
    {
    //	var_dump( $_POST ); // TEST
    	// -----------------
    	// 0- Récupération des données du formulaire
    	$inscrit_par = $_POST['inscrit_par']; // COMMUN à tous
    	// ---------
    	$nom_array = $_POST['nom']; // array
    	$nom_id_array = $_POST['nom_id']; // array
    	$date_type_array = $_POST['type']; // array
     
    	// -----------------
    	// 1- DELETE : on supprime d'abord pour CES DATES, et CE 'nom_id' OU CE 'inscrit_par'
    	// ---------
    	$pdo_params = array();
    	$pdo_params[':nom_id'] = $inscrit_par;
    	$pdo_params[':inscrit_par'] = $inscrit_par;
    	$dates_list = array();
    	foreach( $dates_array as $idx => $date )
    	{
    		if( in_array( $date, $dates_array_valides) ) // OK, date valide
    		{	
    			$pdo_params[':date'.$idx] = $date;
    			$dates_list[] = ':date'.$idx;
    		}
    	}
    	$dates_list = implode(',',$dates_list);	// chaine de la forme :date0,:date1,:date2,...
    //	var_dump( $pdo_params ); // TEST
    	// ---------
    	$delete_query = "DELETE FROM repas_pris
    		WHERE (nom_id = :nom_id OR inscrit_par = :inscrit_par) 
    		AND date_repas IN (".$dates_list.");";
    	try {
    		$pdo_delete = $pdo->prepare($delete_query);
    		$pdo_delete->execute($pdo_params);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
     
    	// -----------------
    	// 2- INSERT - PREPARATION (AVANT les boucles foreach)
    	$insert_query = "INSERT INTO repas_pris
    		(nom_id, nom, date_repas, type_repas, inscrit_par) 
    		VALUES
    		(:nom_id, :nom, :date, :type_repas, :inscrit_par) ;";
    	try {
    		$pdo_insert = $pdo->prepare($insert_query);
    	} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    	// ---------
    	// Pour chaque ligne du tableau
    	foreach( $nom_id_array as $idx => $nom_id )
    	{
    		$nom = $nom_array[$idx];
    	//	echo '<p>nom : '.$nom.' ('.$nom_id.')</p>';	// TEST
    		foreach( $date_type_array[$idx] as $date => $type )
    		{
    			// 2- on n'INSERT QUE les dates où type != 0
    			if( !empty($type) )
    			{ 
    	//			echo '<p>date : '.$date.' - type : '.$type.'</p>'; 	// TEST
    				// 2- INSERT en BDD
    				try {
    					$pdo_insert->execute(array(
    						':nom_id' => $nom_id,
    						':nom' => $nom,
    						':date' => $date,
    						':type_repas' => $type,
    						':inscrit_par' => $inscrit_par,
    						));
    				} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    			}
    		}
    	}
    	// -----------------
    }
    ?>
    </body>
    </html>
    J'ai aussi mis quelques petits morceaux de CSS :
    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
    td,
    th {
        border: 1px solid rgb(190, 190, 190);
        padding: 10px;
    }
     
    td {
        text-align: center;
    }
     
    td[scope="col"] {
        background-color: #DCDCDC;
        color: #000000;
    }
     
    tr:nth-child(even) {
        background-color: #eee;
    }
     
    th[scope="col"] {
        background-color: #DCDCDC;
        color: #000000;
    }
     
    table {
        border-collapse: collapse;
        border: 2px solid rgb(200, 200, 200);
        letter-spacing: 1px;
        font-family: sans-serif;
        font-size: .8rem;
    }
    La récupération des données, et l'update ou l'insert se font bien comme il faut. Merci !
    J'ai sorti, comme on le voit, la connexion et les fonctions des fichiers principaux, et rajouter des include là où il fallait.

    J'ai rajouté dans le javascript et dans le tableau une comparaison de dates, pour griser les dates et choix passés, pour que l'on voit bien ce qui n'est plus modifiable. Est-ce quelque chose qui pourrait se faire directement dans le CSS, ou bien le if que j'ai mis est la bonne méthode ?

    Pourriez-vous m'expliquer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <button type="button" onclick="document.getElementById('InsTable').children[1].removeChild(this.parentElement.parentElement);" title="Supprimer la ligne">X</button>
    Au click, on sélectionne le document par son id, et on prend Instable. Donc là, js sait que je veux travailler sur la table. Mais du coup, il est capable de reconstituer le tableau dans son ensemble ?
    En fait, je n'arrive pas à comprendre comment il se repère. Je prend la table, je prends un enfant (je suppose une ligne) que je veux enlever. Le this correspond-il à la ligne sur laquelle est le bouton ? Et pourquoi on remonte de deux crans avec le parentElement ?

    D'avance, merci !

  15. #35
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour bien comprendre, il faut visualiser la structure HTML de la table :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <table id="InsTable">
    <thead>
       ...
    </thead>
    <tbody>
       <tr>.......</tr>
    ...
       <tr>
          <td>........</td>
    ...
          <td><button type="button" onclick="document.getElementById('InsTable').children[1].removeChild(this.parentElement.parentElement);" title="Supprimer la ligne">X</button></td>
       </tr>
    </tbody>
    </table>

    Donc au clic sur le bouton "X" :
    • 1- document.getElementById('InsTable') : on cible l'élément dont l'id est "InsTable" (donc, la <table id="InsTable">)
    • 2- .children[1] : cible le <tbody> (.children[0] est le <thead>)
    • 3- .removeChild("...") : on va supprimer le noeud enfant "..."
    • 4- this.parentElement.parentElement : le parent du parent de l'élément cliqué (bouton) (-> donc le <tr>)

    En résumé :
    • On supprime toute la ligne (<tr>) contenant le bouton cliqué. CQFD.

  16. #36
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Même s'il est probable que dans la suite de mon travail, j'aurais d'autres questions, je pense qu'on peut considérer ce morceau comme résolu.
    Merci bien pour l'aide apportée !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. erreur bigint requete Employee.fdb via AdoDb
    Par jflebegue dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 04/01/2005, 12h03
  2. Formulaire d'inscription
    Par Gourouni dans le forum ASP
    Réponses: 6
    Dernier message: 02/12/2004, 17h28
  3. [ADODB]probleme de comprehension
    Par flogreg dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 17h15
  4. Inscription dans un site ???
    Par fuXdas dans le forum Web & réseau
    Réponses: 2
    Dernier message: 04/10/2004, 22h53
  5. [VB6]ADODB Command, recuperer l'info d'un RollBack
    Par Mouse dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/05/2003, 17h26

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