Affichage historique des membres

Résolu/Fermé
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 - 13 déc. 2015 à 14:47
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 18 déc. 2015 à 01:03
Bonjour,
Je souhaiterai pouvoir faire l'historique des membres par rapport aux nombres de répétitions de l'année.
J'ai une table dont je récupére les membres présent
ma table
id_repetition
date_repetition
present_repetition

Pour pouvoir gérer cette table j'ai la liste des membres avec une case à cocher pour chaque membre
Jusqu'à là pas de problème ci-joint ma table.


Maitenent avec cette table je souhaiterai du style, le nombre de répétition présent sur le nombre de répétition de l'année.
exemple
Dupont Jacques 15/20
Dupont franck 13/20
etc....
Veuillez m'excuser je ne sais pas si je suis très explicite.
Vraiment merci si vous pouvez essayer de m'aider, inutile de vous dire que je galère depuis bien longtemps.
A voir également:

16 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
13 déc. 2015 à 15:04
Bonjour,

Je pense qu'il y a un soucis dans ton organisation, si le champ "present_repetition" liste les répétitions où la personne était présente, il aurait été préférable d'utiliser une table d'association entres la table des répétitions et la table des personnes.
En l'état, hormis faire un script qui split le champ sur le séparateur adapté, je ne vois pas d'autres solutions.

Si tu avais utilisé une table d'association, tu aurais pu faire un SELECT COUNT(*) sur la table d'association avec un GROUP BY personne.
Puis un petit script ajoutant le nombre total de répétition, et ça serait fait.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
13 déc. 2015 à 15:15
Bonjour
Merci pour votre réponse.
Mon champ present_repetition correspond au IDs de ma table adherent
A votre avis avec cette table où je récupére les IDs des membres présent issu de ma tables des adherents je ne peux pas faire une relation afin de récupérer les noms des adherents.
Excusez moi c'est un peu fouilli mon explication.
Merci
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
13 déc. 2015 à 15:56
Une table d'association est une table avec 3 champs (minimum), Un ID de la ligne, Un vers chaque lien des tables.
Dans ton cas, ce serait 3 champs (Id ligne, Id répétition, Id participant.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
13 déc. 2015 à 16:31
Ce que je ne comprends pas c'est dans ma table actuel present_repetition a bien le lien avec id_adherent
Si je vous montre ma class pour l'ajout des répétitions
<?php
class Repetition_class {
	
	private $id_repetition;
	private $date_repetition;
    private $present_repetition;
	
	private $bdd;
	
	public function __construct($id_repetition, $date_repetition, $present_repetition) {
		
		$this->id_repetition			= $id_repetition;
		$this->date_repetition		= $date_repetition;
		$this->present_repetition 	= $present_repetition;
		
		$this->bdd 					= bdd();
	}
//**********************************************************************************************************
	public function ChampsVideAjoutRepetition() {
		return(empty($this->date_repetition) || empty($this->present_repetition)) ? true : false;		
	}
	
	public function DateExist() {
		$sql = "SELECT *
				FROM  tb_presence_repetition
				WHERE date_repetition = :date_repetition";
		$requete = $this->bdd->prepare($sql);
		$requete->execute(array('date_repetition' => $this->date_repetition));
		$resultat = $requete->fetch();		
		return $resultat;
	}
	
	public function VerifAjoutRepetition() {
		
		if($this->ChampsVideAjoutRepetition()) {
			$erreur = "Veuillez remplir la date de la Répétition";

		} else if($this->DateExist() > 0 ) {
			$erreur = 'Cette date de répétition existe déjà !';

		} else {
			$erreur = 'success';
		}
		return $erreur;
	}
	
	public function AjoutRepetition() {

			$id_adherent = " - " . implode(" - , - ", $_POST['present_repetition']) . " - ";
			
			$sql = "INSERT INTO tb_presence_repetition(date_repetition, present_repetition)
					VALUES(:date_repetition, :present_repetition)";
			$requete = $this->bdd->prepare($sql);
			$success = $requete->execute(array(
										'date_repetition' 		=> $this->date_repetition,
										'present_repetition' 	=> $id_adherent,
										));
			return $success;
	}
//**********************************************************************************************************
}
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
13 déc. 2015 à 20:07
Oui, ton champ a bien la liste des répétitions, mais ce n'est pas utilisable directement via SQL.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
13 déc. 2015 à 16:47
En fait une question me viens.
Comment retourner les noms correspondants aux IDs des membres présent.
0

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

Posez votre question
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
14 déc. 2015 à 08:14
Bonjour
Merci de votre aide, je vais essayer de modifier mes tables comme vous me l'avez suggéré.
Merci
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
14 déc. 2015 à 08:43
Bonjour
En fait quelque chose me parait très bizarre comme vous me l'avez proposé.
Dans mon organisation il y a 1 ligne par répétition et non par adherent donc je ne peux pas faire
(Id ligne, Id répétition, Id participant). sinon au bout d'un an le nombre d'entrée serai astronomique.
Ou alors je définit un index à present_repetition et je cré une clé étrangère.
Je vous rencoie ma table si vous pouvez encore me donner une explication.
Merci
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
14 déc. 2015 à 20:11
Le but d'une table d'association est de traiter ton problème (entre autre).
Il te faut au moins 3 tables :
Répétitions : IdRepet, DateRepet
Adhérents : IdAdeherent, NomAdherent
PresenceRepet : IdPresence (pour faciliter le traitement des lignes si besoin), IdRepet, IdAdeherent

Cela sera plus facile à utiliser que ton système actuel.
Si tu as peu pour la taille, sache que actuellement ton système de stockage ne prend pas forcément moins de place et est largement plus difficile à utiliser.
La taille et la vitesse sera nettement mieux utilisée avec cela.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
14 déc. 2015 à 17:34
Bonjour, pouvez-vous m'aider à essayer de résoudre mon problème s'ils vous plait. J'ai affiché tous les IDs des membres présent de l'année. Maintenant j'aimerai pouvoir lister tous les membres avec leurs noms et faire un COUNT sur le nombre de répétitions, je vous donne mon script et une capture d'écran du résultat.
Merci
<?php
	$sql = "SELECT present_repetition, date_repetition, DATE_FORMAT(date_repetition, '%Y') AS date_present_repetition
			FROM tb_presence_repetition";
	$requete = $bdd->prepare($sql);
	$requete->execute();
	
echo "<div class='ui-accordion'>";

$donnees = $requete->fetch();
?>

<h3 class='ui-accordion-header'><a href='#'><?php echo $donnees['date_present_repetition']; ?></a></h3>
	<div class='ui-accordion-content'>
		<p class='PresentRepetition'>
			<li>
				<span class='colonne01-PresentRepetition'><?php echo $donnees['present_repetition']; ?>
				</span>
			</li>
		</p>
		
<?php

$anneecourante = $donnees['date_present_repetition'];

while ($donnees = $requete->fetch()) {

	if ($donnees['date_present_repetition'] != $anneecourante) {
?>
	</div>
	
<h3 class='ui-accordion-header'><a href='#'><?php echo $donnees['date_present_repetition']; ?></a></h3>
	<div class="ui-accordion-content">
		<p class='PresentRepetition'>
			<li>
				<span class='colonne01-PresentRepetition'><?php echo $donnees['present_repetition']; ?>
				</span>
			</li>
		</p>
	
<?php		
	} else {
?>
		<p class='PresentRepetition'>
			<li>
				<span class='colonne01-PresentRepetition'><?php echo $donnees['present_repetition']; ?>
				</span>
			</li>
		</p>

<?php

	}
	$anneecourante = $donnees['date_present_repetition'];
}
?>
	</div>
</div>

0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
15 déc. 2015 à 12:51
Bonjour
Je vais regarder pour faire les modif de mes tables ainsi revoir mes fichiers PHP comme vous me l'avez suggéré.
Merci en attendant.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
15 déc. 2015 à 21:53
Bonjour
je vais avoir besoin d'un petit coup de main s'ils vous plait
Merci
J'ai créé mes tables

id_date_repetition
date_repetition

id_presence_repetition
rid_adherent index créé avec clé étrangère
rid_date_repetition index créé avec clé étrangère

id_adherent
nom
prenom
etc....

je ne sais pas faire pour pouvoir enregistrer les IDs des membres présents, l'enregistrement de la date c'est OK
voici mon fichier qui liste tous les membres avec checkbox pour enregistrer les membres présents.
<?php
if(isset($_POST['action'])) {
	
	$id_date_repetition		= isset($_REQUEST['id_date_repetition']) ? $_REQUEST['id_date_repetition'] : '';
    $date_repetition			= isset($_POST['alt_date_repetition']) ? $_POST['alt_date_repetition'] : '';
	$id_presence_repetition	= isset($_POST['id_presence_repetition']) ? $_POST['id_presence_repetition'] : '';
	$rid_adherent				= isset($_POST['rid_adherent']) ? $_POST['rid_adherent'] : '';
	$rid_date_repetition		= isset($_POST['rid_date_repetition']) ? $_POST['rid_date_repetition'] : '';

	$PresentRepetition = new Present_Repetition_class($id_date_repetition, $date_repetition, $id_presence_repetition, $rid_adherent, $rid_date_repetition);
	$VerifAjoutDateRepetition = $PresentRepetition->VerifAjoutDateRepetition();
	
	if($VerifAjoutDateRepetition == 'success') {
		
		if($PresentRepetition->AjoutPresentRepetition()) {
			$success_info[] = "L'enregistrement c'est bien effectué";
		} else {
			$erreur_info[] = "Une erreur est survenue";
		}
		
	} else {
		$erreur_info[] = $VerifAjoutDateRepetition;
	}	
}

if (isset($erreur_info)) {
	echo erreurs($erreur_info);
}
if (isset($success_info)) {
	echo success($success_info);
}
?>

<div id="PresentRepetition">
	<form id="formulaire" action="" method="post">
		<span style="float: right";>Date de la Répétition
			<input name="date_repetition" id="date_repetition" class="PresentRepetition" size="30" type="text" value="">
			<input type="hidden" id="alt_date_repetition" name='alt_date_repetition'>
		</span>
			<table cellpadding="0" cellspacing="1">
				<tr>
					<th width="36%">Présent</th>
				</tr>
<?php
	$sql = "SELECT *
			FROM tb_gestion_participant
			LEFT JOIN tb_adherent
				ON tb_adherent.id_adherent = tb_gestion_participant.rid_adherent
			WHERE actif = 1
			AND participant_repetition = 1
			ORDER BY nom, prenom ASC";
	$requete = $bdd->prepare($sql);
	$requete->execute();
		
	while($donnees = $requete->fetch()) {
				
			echo'<tr>';
				echo'<td width="30%">';
					echo'<input type="checkbox" name="rid_adherent[]" class="styled" value=" '.$donnees['id_adherent'].' " />';
					echo'<label for="id">' .$donnees['nom'] . ' ' . $donnees['prenom']. '</label>';
				echo'</td>';
			echo'</tr>';
	}
?>
			</table>
				<input name="action" value="ajouter" type="hidden" />
				<a href="javascript:void(0)"><input type="submit" class="submit" value="Enregistrer"/></a>
			
	</form>					
</div>
	
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
16 déc. 2015 à 01:29
Bonjour
Du coup cette nuit j'ai eu un déclic et ça fonctionne à merveille grâce à votre aide
table date_repetition
id_date_repetition date_repetition
1 2015-12-16
table presence
id_presence rid_adherent rid_date_repetition
1 60 1
et bien sur la table des adherents
Merci mille fois maintenant je vais pouvoir faire mes statistiques.
Encore merci 1
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
16 déc. 2015 à 12:13
Bonjour
En fait je viens de m'apercevoir d'un problème.
Lorsque je coche 1 checkbox l'enregistrement dans ma BDD ce fait bien, mais lorsque je coche plusieurs checkbox seul 1 ID d'un membre est pris en compte dans ma BDD.
Avez-vous une petite idée à me donner s'ils vous plait.
Je vous remercie
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
16 déc. 2015 à 17:20
Bonjour, quelqu'un pourrait-il m'aider s'ils vous plait.
Voici ma checkbox
echo'<input type="checkbox" name="rid_adherent" class="styled" value=" '.$donnees['id_adherent'].' " />';

Merci
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
16 déc. 2015 à 20:39
Dans ce cas, j'ai l'habitude de donner un nom unique à mes case à cocher.
genre : MembreId
Et ensuite, tu parcours la liste des données remontées lors de la validation du formulaire pour voir la liste des case cochées.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
17 déc. 2015 à 17:53
Il faut bien distinguer les règles en usage sur les formulaires. C'est une norme.

On ne peut cocher qu'un seul bouton radio sur plusieurs qui sont proposés. Donc un seul bouton coché, une seule valeur retournée, un seul nom. Si tu as plusieurs boutons radio, tes input type="radio" auront tous le même attribut name.

En revanche, s'il y a plusieurs cases à cocher qui sont proposées, on peut en cocher plusieurs. Il y aura donc plusieurs valeurs qui seront retournées, il faudra donc plusieurs noms et tes input type="checkbox" devront avoir tous un attribut name différent.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
16 déc. 2015 à 23:11
Bonjour, merci pour votre aide. En fait le name de mes cases à coché c'est "rid_adherent" mais ensuite je n'ai pas compris.
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
17 déc. 2015 à 13:27
Bonjour je suis désolé je n'arrive toujours pas à résoudre mon problème de checkbox.
Même si je sélectionne plusieurs case à cocher l'enregistrement se fait simplement sur 1 checkbox.
Avez-vous une idée en vous remerciant.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
Modifié par heliconius le 17/12/2015 à 14:18
Bonjour,

ADHERENTS--0,n---(Assister à)---0,n--REPETITIONS
`----------0,n--DATES

Cardinalités (minimales, maximales) :
Adérents (0,n) : Il se peut qu'un adhérent ne participe pas à la relation "Assister à" (0 = il est absent à telle réunion) ou qu'il participe plusieurs fois (n = il est venu à plusieurs répétitions)
Répétitions (0,n) : Il se peut qu'une répétition prévue (et enregistrée dans la table répétitions) n'ait pas eu lieu (0) mais il se peut (et c'est souhaitable) qu'à une répétition donnée il y ait eu plusieurs personnes (n)
Dates (0,n) : Il se peut qu'à une date donnée il n'y ait pas eu de répétition (0), mais il se peut qu'à une même date il y ait eu plusieurs présents)

Trois objets => 3 tables :
ADHERENTS(idadh, nom, prenom, etc.)
REPETITIONS(idrep, sujet, etc.)
DATES(date)
NB: Les clefs primaires sont soulignées

Règle: Toute les cardinalités maximales sont à n => création de la table ASSISTER (correspondant à la relation "Assister à") qu'on pourra appeler aussi "Présence" mais je préfère ASSISTER qui est un verbe et qui traduit mieux l'idée d'une relation qu'un nom. Sémantiquement parlant je trouve qu'on comprend tout de suite quand dans une base de données on voit les tables ADHERENTS, ASSISTER, REPETITIONS.

La table ASSISTER récupèrera les identifiants de tous les objets qui participent à cette relation (c'est-à-dire: ADHERENTS, REPETITION, DATES) et l'ensemble de ces identifiants formera l'identifiant de la relation, ce qui empêchera certaines erreurs telles que pouvoir saisir plusieurs fois le même adhérent à la même répétition pour la même date.

Toutefois comme l'objet DATES ne contient qu'un seul champ et que ce champ, un identifiant, est présent dans la table ASSISTER, il n'y aura pas de création de la table DATES, vu que l'information est présente ; ce qui donne comme tables utiles :

ADHERENTS(idadh, nom, prenom, etc.)
REPETITIONS(idrep, sujet, lieu, etc.)
ASSISTER(date, idrep, idadh, obs, etc.)

ADHERENTS:
+-----+--------+----------+-----+
|idadh| nom | prenom | etc |
+-----+--------+----------+-----+
| 1 | MARTIN | Jean | ... |
| 2 | DUPONT | Isabelle | ... |
| 3 | DUVAL | Denis | ... |
| ... | ... | ... | ... |


REPETITIONS:
+-----+------------------------+-----+
|idrep| sujet | etc |
+-----+------------------------+-----+
| 1 | Beethoven 5°S 1er mvt | ... |
| 2 | Beethoven 5°S 2ème mvt | ... |
| 3 | Mozart 40°S 1er mvt. | ... |
| 4 | Mozart 40°S 2ème mvt. | ... |
| ... | ... | ... |
NB: Je suppose pour l'exemple qu'il s'agit de répétitions musicales d'autant plus qu'aujourd'hui, 17 décembre, c'est le 245ème anniversaire de la naissance de Beethoven :-)

ASSISTER:
+------------+-----+-----+---------+-----+
| date |idrep|idadh| obs | etc |
+------------+-----+-----+---------+-----+
| 2015-01-09 | 1 | 119 | ... ... | ... |
| 2015-01-09 | 1 | 3 | ... ... | ... |
| 2015-01-09 | 1 | 176 | ... ... | ... |
| 2015-01-16 | 2 | 119 | ... ... | ... |
| 2015-01-16 | 2 | 175 | ... ... | ... |
| 2015-01-16 | 2 | 126 | ... ... | ... |
NB: Ci-dessus, j'ai repris tes numéros d'adhérents

S'il en était besoin, on aurait pu rajouter un objet LIEU (de répétition) pour participer à la relation "Assister à" (tel adhérent assiste à telle réunion à telle date et dans tel lieu). Si c'était le cas, cet objet LIEU donnerait son identifiant à la relation "Assister à" pour donner :
LIEU(idlieu, désignation, adresse, etc.)
ASSISTER(date, idrep, idadh, idlieu, obs, etc.)

A partir de là, tu peux tout calculer :
- le nombre de présents pour chaque répétition,
- le nombre de présences de tel adhérent pour l'année,
- le nombre de répétitions pour une année donnée,
- le nombre moyen de présents aux répétitions en général,
- etc... (j'arrête la liste, elle est trop longue)

La manière avec laquelle tu as bâti ta table de présence, n'est pas la bonne et est génératrice soit d'erreurs, soit d'impossibilité à satisfaire une requête donnée.

Le nombre d'enregistrements qu'il y aura dans la table ASSISTER importe peu, MySQL gère ça très bien et avec l'utilisation des clefs primaires ça passera comme une lettre à La Poste. En revanche, si tu faisais ça avec Access, je serais moins rassuré quant à l'efficacité.
.
A mon humble avis, il te faut recommencer. Certes cela va te donner du travail et des lignes de code pour récupérer les données déjà présentes dans ton actuelle table et les injecter dans de nouvelles mais, vu ton utilisation de classes PHP, je suis sûr que tu sauras faire et surtout il vaut le mieux le faire maintenant que plus tard quand ton développement sera encore plus avancé.

Tu peux aussi conserver tes structures actuelles et te mettre dans l'obligation d'appliquer pansements sur cataplasmes sur l'existant pour essayer d'obtenir les calculs que tu veux mais je suis convaincu que ça sera une galère et même que certains te seront impossible à réaliser.

Bon courage...
Un problème sans solution est un problème mal posé. (Albert Einstein)
0
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 3
17 déc. 2015 à 20:16
Bonjour
Déjà un grand merci pour cette explication très claire, très explicative.
Tu as raison c'est bien des répétitions musicales, par contre je na savais pas la naissance de Beethoven........................merci pour cet info
Par contre pour ma BDD je suis bien avec PhpMyAdmin....

Alors si je suis tes explications 2 tables me sont utiles en comptant la table adherent qui existe déjà.
La table répétition pour l'instant elle ne met pas utile

Table ASSISTER ça donnerai ça
id_assister
date_assister
rid_adherent clé étrangère

Pour l'instant mon but c'est de noter les membres présent à chaque répétition et de pouvoir faire un état en fin d'année. Par exemple récompensé les plus assidus.......

Vous pouvez déjà me donner votre avis sur la création de la table.
Merci
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
18 déc. 2015 à 00:42
J'ai bien compris ton but mais, tel que ci-dessus, la table ASSISTER ne contient pas de clef étrangère, c'est une table de relation. Les trois champs correspondant aux trois objets (ADHERENTS, REPETITONS et DATES) forment ENSEMBLE la clef primaire de la relation et si l'un de ces identifiants est "176, 3, 2015-01-09" (qui veut dire l'adhérent n°176 a assisté à la répétition n°3 le 09/01/2015), c'est le système de base de donnée MySQL lui-même qui refusera une seconde saisie de cette même (ensemble de) clef primaire.

Si pour des raisons de facilité (diverses) tu rajoutes un identifiant numérique auto_increment (en clef primaire) à la table assister et les autres champs (date_repetition, rid_adherent) en clef étrangère, le système ne refusera pas une seconde saisie d'une même répétition, à partir du moment où ta clef primaire est différente. Si je me réfère à ce que tu as écrit, à savoir :
Table ASSISTER ça donnerai ça
id_assister
date_assister
rid_adherent clé étrangère

Si tu places rid_adherent en clef étrangère, cela peut vouloir dire qu'on peut interpréter ce que tu dis de deux manières :
1) id_assister et date_assister forment ensemble la clef primaire ou que
2) id_assister est clef primaire et date_assister est juste une propriété portée par la relation

Une clef primaire NE PEUT PAS être saisie deux fois, c'est le principe même d'une clef primaire. Donc,

cas 1

+-----------+-------------+------------+
|id_assister|date_assister|rid_adherent|
+-----------+-------------+------------+
| 1 | 2015-01-09 | 119 |
| 2 | 2015-01-09 | 3 |
| 3 | 2015-01-09 | 176 |
| 4 | 2015-01-16 | 60 |

Ce qui pose un gros problème : clef primaire = id_assister+date_assister DONC cet identifiant ne pourra apparaître qu'une seule fois. Ce qui reviendra à dire qu'à chaque répétition il n'y aura qu'une personne. En effet, si tu as déjà saisi "1, 2015-01-09, 119", tu ne pourras pas saisir "1, 2015-01-09, 3" (un autre adhérent pour la même répétition de la même date) car même s'il s'agit d'un autre adhérent, l'identifiant est le même (1, 2015-01-09)

cas 2
+-----------+-------------+------------+
|id_assister|date_assister|rid_adherent|
+-----------+-------------+------------+
| 1 | 2015-01-09 | 119 |
| 2 | 2015-01-09 | 3 |
| 3 | 2015-01-09 | 176 |
| 4 | 2015-01-16 | 60 |
| 5 | 2015-01-09 | 119 |

id_assister seul est clef primaire ce qui veut dire qu'il ne pourra pas exister deux répétitions avec le même numéro, en revanche tu pourras saisir deux fois le même adhérent pour la même date "1, 2015-01-09, 119" et "5, 2015-01-09, 119" pourront coexister vu que l'identifiant est différent (cas ci-dessus où id_assister est 1 ou 5). Et en plus à chaque répétition (id_assister), il n'y aura qu'une personne : à la répétition n°1, il n'y aura que l'adhérent n°119, à la répétition n°2 que l'adhérent n°3, etc...

C'est clair que :
SELECT ....
FROM ...
WHERE date="2015-01-09'
AND idrep=2
AND idadh=119

est plus contraignant à écrire que
SELECT ...
FROM ...
WHERE id_assister=2

mais au moins la base est conçue de manière à ne pas pouvoir générer les erreurs que je viens de citer.

Par ailleurs, mais ceci à première vue peut apparaître du détail mais utiliser des noms de champs tels que rid_adherent, date_assister, present_repetition est tout à fait possible mais pour ma part, je préfère utiliser des noms de champs courts (il y a nettement moins de code à écrire pendant le développement. Tu imagines date_adherent_assiste_repetition comme nom de champ ?) et il faut qu'ils soient parlants. Il ne faut pas craindre des confusions avec des noms de champs identiques (parfois). Le contexte clarifie le sens. Exemple :
ADHERENTS--0,n---(Assister à)---0,n--REPETITIONS
`----------0,n--DATES

ADHERENTS(idadh, nom, prenom, etc.)
REPETITIONS(idrep, sujet, lieu, etc.)
ASSISTER(date, idrep, idadh, obs, etc.)

ADHERENTS--0,n---(Naitre à)---0,n--VILLES
`--------0,n--DATES

ADHERENTS(idadh, nom, prenom, etc.)
VILLES(idvil, ville, lieu, iddep, etc.)
NAITRE(date, idvil, idadh, acte, etc.)

Des adhérents nés à telle date dans telle ville assistent à telle date à telle répétition, c'est un cas que tu ne gères peut-être pas mais qui pourrait se rencontrer (adhérents à un club de parachutisme où il faudrait que les adhérents soient majeurs, donc + de 18 ans, donc date de naissance enregistrée).

On comprend aisément que le champ date de la table NAITRE n'a pas le même sens que le même de nom champ dans la table ASSISTER !

Si tu veux gagner du temps, prends ton temps. Pars du principe suivant : si un développement doit durer un an, il y aura 6 mois d'analyse, 4 mois de codage et 2 mois de débuggage. (respectivement 50%, 33%, 17%). Quelle que soit la durée du développement ce sera approximativement ces mêmes proportions. Ceci pour dire que la partie analyse, réflexion pour la réalisation de la base de données est très importante et y passer du temps permet ensuite de savoir exactement où l'on va pour coder rapidement sans trop d'erreurs.

Je peux t'aider à modéliser ta base de données mais j'ai besoin d'en savoir plus sur tes tables. Dans ce cas, tu peux m'écrire en privé et me faire parvenir le schema de ta base (onglet exporter dans phpMyAdmin. Exporter toute la base sans les données, qui ne me regardent pas.

Bonne nuit...
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137 > heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
Modifié par heliconius le 18/12/2015 à 01:06
J'ai oublié de préciser quelque chose. Tu dis :
"La table répétition pour l'instant elle ne met pas utile"

Le "pour l'instant" me chagrine. Il ne faut pas penser à l'instant présent mais être sûr et certain que tu n'auras jamais à l'utiliser. Si tu fais TOUT ton développement en partant du principe qu'elle ne te sert pas, le jour où tu en auras besoin, il te faudra modifier tous tes scripts, tous tes formulaires, toutes tes requêtes... Je ne te raconte pas le travail de ouf !

Bon, cette fois, je vais au lit. Bye.
0