Problème de formulaire dynamique

Résolu
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005 - 16 nov. 2005 à 11:57
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005 - 17 nov. 2005 à 15:06
Bonjour,
Bon je vais essayer d'être clair: j'ai une table mysql avec nom prénom et un code service
je fais une requete pour afficher tout le monde pour un service bien precis jusque là ça va.
Sauf que pour chaque personne affichée j'ajoute des cases cochées pour valider leur présence durant la semaine.
Comment je peux récupérer les données nom par nom ? là je bloque je joins une partie de mon code :

mysql_select_db($database_connexion_bdd, $connexion_bdd);
$query="SELECT nom,prenom,id_agt FROM presence_agent WHERE code_serv='inf'ORDER BY nom ASC";
$resultat=mysql_query ($query)or die (mysql_error());
$count=mysql_num_rows($resultat);

while($data=mysql_fetch_array($resultat))
{
$nom=$data['nom'];
$prenom=$data['prenom'];
$id_agt=$data['id_agt'];

echo"
<tr>
<td rowspan="2">$nom
</td>
<td rowspan="2">$prenom</td>
<td>Matin </td>
<td>

</td>
<td>

</td>
<td>

</td>
<td>

</td>
<td>

</td>
</tr>
<tr>
<td value="1">
Apr&egrave;s-midi</td>
<td value="1">

</td>
<td value="1">

</td>
<td value="1">

</td>
<td value="1">

</td>
<td value="1">

</td>
</tr>";

}

Merci d'avance pour votre aide

David

10 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 nov. 2005 à 12:25
Hello,

tu t'y prends mal.

ton tableau pour la checkbox, $_POST['tableau'][]
Il est mal créé.

Je m'explique.
Dans un service, tu as 1 ou n personnes.
Donc, virtuellement, tu peux recréer ces checkbox, dans le même formulaire, n fois. Ton problème est que du coup, quand tu coches, tu te retrouves avec un tableau long (là, n * 10 entrées). Je suppose que pour toi, $tableau[0] correspond au 1er horaire de la matinée.
Ce n'est pas une bonne idée!


A ta place, je ferais un truc du genre :
Déjà, je passerais par un slect multiple, c'est plus sympa. Mais bon, le principe est le même que pour tes checkbox.


Dans ma table personne, j'aurais un personne_id


Je créerais une table horaires, avec horaire_nom, horaire_id.
Par exemple : 8h - 9h , 1
9h - 10h , 2 ...etc

Et j'aurais une table horaire_personne, avec personne_id et horaire_id.

Ensuite, mes checkboxes:
]" value="<?php echo $horaire_id; ?>" /> => sachant qu'il faut boucler sur ta table horaire pour créer ces checkboxes.

Tu récupèreras ainsi un tableau du genre :
$_POST['horaire'][$personne_id] = $horaire_id.

Dans une boucle, il te suffira de remplir ta table de jointure personne_horaire :
foreach ($_POST['horaire'] as $personne => $horaire) {
// requête du type : INSERT INTO personne_horaire (personne_id, horaire_id) VALUES ($personne, $horaire)
}

Et quand tu veux savoir pour une personne x, quels horaires ont été attribués, il te suffit de parcourir la table personne_horaire WHERE personne_id = $x_id, et de faire une jointure, tant qu'à faire, sur la table horaire pour avoir le nom des horaires.

SELECT
hor.horaire_nom,
pers.personne_nom
FROM
horaire AS hor,
personne AS pers,
personne_horaire AS ph
WHERE
(ph.horaire_id = $horaire) AND
(ph.personne_id = $personne) AND
(pers.personne_id = ph.personne_id) AND
(hor.horaire_id = ph.horaire_id)
ORDER BY
pers.personne_nom,
hor.horaire_nom
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 nov. 2005 à 14:29
Attention, de ce que je comprends, ce n'est pa sune relation 1, n, mais bien n, n.

1 service peut avoir n activités.

Mais 1 activité peut appartenir à n services... non ?

Par exemple, le service Filles peut faire les activités tricot, potins, drague

Le service garçon peut faire les activités foot, beuveries, drague.

Non ?



Donc oui, c'est le même principe pour la structure de la table :

service : service_nom, service_id

activité : activite_nom, activite_id

service_activite : activite_id, service_id



Et pour l'affichage, oui, même principe.
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 nov. 2005 à 12:50
Re,



$_POST['horaire'][$id_agt]=$horaire_id;

=> pourquoi tu fais ça...? Là tu effaces ton tableau.



Voilà tes checkboxes :



Donc le nom c'est horaires[x] ou x est un id (et est variable, donc). Selon toi...sauf que tu te plantes dans les variables.

au passage, simplifions ta ligne, et corrigeons la... :

echo"<td>

</td>\r\n";

=>

echo'<td>

</td>';



Pas besoin de réaffecter tes $data...



Donc ton tableau post sera : $_POST['horaires'] (note que tu as oublié le 's', déjà).

Donc, la clef l'id de ton agent, et la valeur l'id de ton horaire.

Ensuite, ta boucle :



foreach ($_POST['horaires'] as $id_agent => $id_horaire)



je te laisse poursuivre, ça doit être assez explicite ;-)
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 nov. 2005 à 14:39
Et encore, je suis au boulot... ;-)

Non tu as raison, j'ai oublié horaires sur ce coup ;-)

name="horaires[',$data['id_agt'],']"

Si ça ne fonctionne pas, au lieu de faire ton foreach et ton insertion, affiche le tableau ainsi :

echo '',print_r($_POST['horaires']);,'

';
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005
16 nov. 2005 à 13:40
Merci beaucoup c'est une bonne piste d'approche, et je vais surement l'adopter en l'adaptant.
En abusant un peu : j'ai une table activités avec entre autres la duree qui doit être modifiable. Pour un service,Il y a n activités, si je fais une requête pour afficher les activités d'un service possible sous forme de formulaire, est-ce que je dois adopter le même système?
Je suis désolé je n'ai pas de code à proposer je n'ai rien commencer (le fainéant..) mais au niveau du concept c'est à dire pouvoir modifier la durée de chaque activité et faire une mise à jour pour chacune d'entre elles ?

Merci encore

David
0
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005
16 nov. 2005 à 15:43
Très bien c'est ce que j'avais compris (manquait plus que la confirmation ) y'a plus qu'à mettre en pratique, c'est le plus marrant.
Merci pour cette aide précieuse et très rapide
David
0
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005
17 nov. 2005 à 11:45
Bon me revoilà ...
J'ai bien suivi les instructions de la première réponse : l'affichage des checkboxes se fait bien :

mysql_select_db($database_connexion_bdd, $connexion_bdd);
$query="SELECT nom,prenom,id_agt FROM presence_agent WHERE code_serv='inf'ORDER BY nom ASC";
$resultat=mysql_query ($query)or die (mysql_error());
$count=mysql_num_rows($resultat);

while($data=mysql_fetch_array($resultat))
{
$nom=$data['nom'];
$prenom=$data['prenom'];
$id_agt=$data['id_agt'];

echo"
<tr>
<td>$nom
</td>
<td>$prenom</td>\r\n";
$query1="SELECT horaire_id FROM horaires ORDER BY horaire_id ASC";
$resultat1=mysql_query ($query1)or die (mysql_error());
while
($data1=mysql_fetch_array($resultat1))
{
$horaire_id=$data1['horaire_id'];
echo"<td>

</td>\r\n";

}
}

Mais là où j'ai un souci c'est pour la récupération des données. Y' a un truc qui me chiffonne : le tableau est vide

$_POST['horaire'][$id_agt]=$horaire_id;
//Insertion dans la base de données
mysql_select_db($database_connexion_bdd, $connexion_bdd);
foreach($_POST['horaire'] as $agt => $horaire)
{
$query_insert="INSERT INTO horaire_personne (id_agt,horaire_id)
VALUES ('$agt','$horaire')";
mysql_query ($query_insert)or die (mysql_error());

}
je suis certain que c'est là que je m..de et là je vois pas (j'suis un boulet des fois).

A l'aide merci

David
0
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005
17 nov. 2005 à 13:57
Je suis toujours étonné de la rapidité de la réponse. Je ne suis pas habitué à une telle efficacité ;-)
Bon déjà je te dois des excuses j'ai fait un copier coller d'un fichier test donc bon forcément....
Seulement dans ta réponse sur la simplification de la ligne echo'..... au niveau name="',$data['id_agt'],'" il n'y a pas d'initialisation de tableau "horaires" ?
Je me trompe ou j'ai les boyaux de la tête constipés?

Merci

David
0
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005
17 nov. 2005 à 14:24
Bon j'en rajoute une couche j'avoue que je commence à être dans le brouillard : pour chaque id_agt tu peux avoir 1 à plusieurs horaires de sélectionnés. Le souci c'est qu'en suivant tes instructions dans ma table horaire_personne il y a un enregistrement de id_agent et du dernier horaire_id coché.
Là je crois que j'avais compris le concept mais j'ai l'impression que je suis complèment à l'ouest.

Désolé d'être aussi pénible mais j'aime comprendre ce que je fais.

Merci

David
0
labouse Messages postés 7 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 17 novembre 2005
17 nov. 2005 à 15:06
Bon là speedy gonzales peut toujours se brosser .
J'ai effectivement fait un print_r c'est pour çà l'objet du deuxième post de l'après midi.
Ca me récupère bien id_agt et le dernier horaire_id coché. Bon maintenant rassure moi :
le but du jeu est bien d'avoir dans la table horaire_personne pour chaque id_agt, tous les horaires cochés?
avec dans la table : plusieurs fois le même id_agt et plusieurs horaire_id différents ceux-là.

D'où l'autre question pour le tableau horaires en indice on met id_agt et en valeur l'horaire_id, or l'indice est toujours le même donc cela me parait normal d'avoir un tableau avec un indice different et unique pour chaque id_agt et uniquement dernier horaire_id coché. Y'aurait pas une histoire de tableau multidimensionnel à mettre en place?

Merci

David
0
Rejoignez-nous