Créer un n° identique pour une paire (2 personnes)

Eléphant du PHP | 55 Messages

08 sept. 2013, 22:34

Bonjour,
J'essaie de créer une table dans laquelle je puisse associer deux personnes.
L'idée est de créer un formulaire qui a les champs basiques d'inscription nom, prénom, email et mdp.
Je rajoute une checkbox qui permet d'associer une personne a à la personne b si elle est cochée. Cela se traduit par l'affichage d'un second formulaire sur la même page.
Je fais ma requête sql insert une personne a si non cochée et personnes a & b si cochée.
Mais je souhaiterais également pour le cas 2 (personnes a et b) insérer un identifiant (générer par une méthode car auto_increment est déjà utilisé pour l'id) mais qui soit identique pour les 2.
Quelqu'un pourrait-il me donner une piste pour la requête car je ne vois pas comment intégrer le même noIdent pour 2 personnes juste après le submit.
Dans ma table personnes
id_pers
nom
prenom
email
mdp
noIdent
PS: je suis en train de travailler sur le code, je le poste asap.

L'objectif étant de créer une session basée sur cet identifiant + nom pour que 2 personnes puissent se connecter à un même espace membres par ex.

Merci par avance,
Ionesco

Eléphant du PHP | 229 Messages

09 sept. 2013, 08:27

Bonjour,
L'utilisation combinée d'une division, de Modulo 2 et de if.
Je continu a réfléchir a plus simple
bon codage.

Eléphant du PHP | 55 Messages

09 sept. 2013, 10:56

Bonjour,
Je comprends ce que tu sous-entends. Néanmoins le 2 s'applique au nombre de personnes. Il faudrait donc que je crée une variable à laquelle j'affecte 1 ou 2 selon si c'est coché ou non.
Si coché
nbPers=2
else
nbPers=1

Ensuite if(2) on insère les 2 (je suppose que je dois faire une boucle) et if(1) on insère 1 personne.
Je ne suis pas sûr que ça fonctionne. Je vais essayer de le coder et reviendrai poster le résultat.

Dans ce cas précis, je ne vois pas où mettre le modulo.
Cordialement,
Ionesco

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 sept. 2013, 11:14

salut,

Perso je ne comprend pas le besoin.

tu souhaite que deux personnes, avec deux comptes différents aient accès aux mêmes ressources ?

si oui c'est une gestion de droit au niveau des ressources qu'il faut faire et non au niveau de utilisateur.

Dans ce cas tu créer un groupe aux quels sont associé les utilisateurs.
L'avantage de cette solution est qu'elle évolutive, si demain c'est 18 personnes qui travaillent sur le même doc tu n'as pas à modifier la structure de la base.

exemple de table groupe
idgroupe : int auto_increment primary key
nomgroupe : varchar(20) : un nom pour le groupe je sais pas c'est utile.

la liaison entre les utilisateurs et les groupes dépend si un utilisateur peux appartenir à un ou plusieurs groupes (d'après ce que tu indique un seul groupe).
dans le cas d'une seul groupe tu ajoute une colonne idgroupe sur la table utilisateur (fk vers table groupe).

si un utilisateur peux faire partis de plusieurs groupe (solution évolutive même si tu n'utilise que l'appartenance à un groupe) une table simple
userGroup
#idgroupe
#userid

idgroupe et userid étant la pk de cette table

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 790 Messages

09 sept. 2013, 11:14

Salut, je pense que le mieux serait de créer une table couple...
Table: couple
=> id_couple = 78
=> id_individu_1 = 4
=> id_individu_2 = 456
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 2278 Messages

09 sept. 2013, 11:20

Si je suis bien:
Toto a pour id autoincrement 1
Il coche la case On est deux, et on affiche un formulaire concernant son binôme.
table
id : autoincrement
id_manuel : int
le reste comme tu veux par exemple:
nom : text

Quand tu crées le premier du binome, tu procèdes en deux temps:
insertion
insert ... into (nom) values('toto');
récupération de l'id créé automatiquement et mise à jour de la table:
update .. set id_manuel = LAST_INSERT_ID();
Pour le second, tu peux procéder en une seule fois..
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 55 Messages

09 sept. 2013, 11:29

Merci pour vos réponses. Je vais les tester.
L'idée est de créer parmi un groupe d'élèves, par ex, un binôme qui puisse travailler sur un projet commun et mettre sur leur espace les documents communs. Et échanger à distance.
Je voudrais que la session prenne en compte leur idgroupe/id_couple pour se connecter plus leur nom.
Je travaille sur le code et reviens vers vous.
Cordialement,
Ionesco

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 sept. 2013, 11:50

il est préférable de jouer sur la mise à disposition des documents.

et la pour le coup de créer des groupes (binôme, trinôme, xnôme :mrgreen:) que tu peux associer à un projet.

ce qui permet une souplesse étonnante, vue que les élève pourront avoir des groupes différents sur les différents projets qui leurs seront soumis.
Et donc lorsqu'un élève se connecte tu lui affiche les documents associé aux différents projets aux quels il participe (liaison projet / élève) ET appartenant à son groupe pour chaque projet.

Cela te permet la mutualisation des documents (qui appartiennent aux groupes et pas aux élèves).
Tu n'as pas a créer un système d'authentification foireux ;)
ton système est évolutif et pas lié à la contrainte du jour (par exemple je suis tomber dans des classes avec des nombres impaires d'élèves ou des classes qui n'avais pas assez de poste de TP pour n'avoir que des binômes et du coup cette contrainte est ainsi levé ;) ).


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

09 sept. 2013, 12:41

Moogli
Je n'ai pas encore abordé la question de la mutualisation.
Bientôt j'espère.
Ionesco

Eléphant du PHP | 55 Messages

09 sept. 2013, 14:39

Bonjour,
J'ai essayé un code qui m'enregistre bien un binôme mais avant que j'ai pu compléter le deuxième form que j'ai mis dans le code php.
Problème, il apparaît au-dessus du premier form sur ma page (le form 2 n'est pas complet, je suis en phase de test, sorry :wink: )
Je voudrais le placer en-dessous tout en gardant sur la page mon premier form rempli après avoir coché la checkbox. Cela signifie que je dois le mettre après le HTML et finir mon code php après?
D'autre part le 2ème s'affiche tout de suite, sans que j'ai eu à cocher la boîte.
Peut-on déclencher l'affichage du form juste avec une checkbox? C'est ce que j'ai essayé de faire mais à priori ça ne fonctionne pas. Du javascript?
Ensuite par rapport aux solutions proposées de créer un groupe, je ne vois pas comment créer une clé primaire pour id (en auto_increment) et id_groupe. J'ai essayé une erreur s'affiche. Les 2 ne sont pas compatibles. Je ne suis pas expert en bdd mais à priori c'est possible quand on hérite d'une pk d'une autre table pour faire la jonction entre les 2.
Pour créer un n° groupe aléatoire, au moment de l'inscription, je ne peux le faire qu'à partir d'une fonction que j'inclurai. Et ensuite l'insérer dans la table pour les 2 personnes créées en même temps. Je vais chercher une solution mais pour le moment, cela reste flou.
PS: je n'ai pas encore créé une session. A venir.
Je vous sollicite pour me donner quelques pistes de réflexion que je modifie mon code.

Voici le code:
<?php
	try {
		$dns='mysql:host=localhost; dbname=exam2013'; // le chemin vers le serveur
		$user='root'; // nom d'utilisateur pour se connecter
		$mdp=''; // mot de passe de l'utilisateur pour se connecter
		$dbcnx=new PDO($dns,$user,$mdp); 
		$dbcnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
	}catch (PDOException $e ){
		echo 'Erreur PDO : '.$e->getMessage();
	}

	if(isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['mail'])){
		$nom=$_POST['nom']; 
		$prenom=$_POST['prenom'];
		$mail=$_POST['mail'];
		$code=$_POST['code'];
		 
		 
	 if(isset($_POST['crea_bin']) && $_POST['crea_bin']=='YES'){
		$creaBin=1; 
	 }else{
		$creaBin=0; 
	}  
		
	if($creaBin==1){
		        //echo '<form method="post" action="formBinome.php">';
				echo 'Nom &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
				echo '<input type="text" name="nom"/>';
				
				$req=$dbcnx->prepare('SELECT * FROM binome WHERE nom=:nom');
				$req->execute(array(
						'nom'=>$nom));					
				if($req->fetchColumn()==0){
						$sql="INSERT IGNORE INTO binome(nom,prenom,mail,code,crea_bin) VALUES(:nom,:prenom,:mail,:code,:crea_bin)"; 
						$prepa=$dbcnx->prepare($sql);
						$resultats=$prepa->execute(array(
								'nom'=>$nom,
								'prenom'=>$prenom,
								'mail'=>$mail,
								'code'=>$code,
								'crea_bin'=>$creaBin
								));
								
				}
		}
		echo "Binôme bien enregistré"; 
	}else{
		//A compléter
	}
Cordialement,
Ionesco

Eléphant du PHP | 229 Messages

09 sept. 2013, 20:01

tu incrémentes de 1 ton compteur si =0 et ton id_groupe de 1 et remise à zéro du compteur si compteur=1

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 sept. 2013, 14:13

c'est un peu fouillis ton affaire ;)

pour le second formulaire si tu doit l'afficher au clic (bouton, case à cocher ou autre) il faut effectivement utiliser javascript. N'importe quel framework JS (comme jquery ou extjs) devrait t'y aider facilement.

ensuite pour expliquer plus facilement ce que j'ai voulu dire voici un exemple concret du modèle proposé (merise)
le MCD (modèle conceptuel de données)
Image
Le MDP (modèle physie que données) correspondant
Image

ceci se traduit par ce code SQL
[mysql]CREATE TABLE user(
userid int (11) Auto_increment NOT NULL ,
nom Varchar (25) ,
prenom Varchar (25) ,
PRIMARY KEY (userid )
)ENGINE=InnoDB;

CREATE TABLE projet(
projectid int (11) Auto_increment NOT NULL ,
nom Varchar (25) ,
description Varchar (255) ,
PRIMARY KEY (projectid )
)ENGINE=InnoDB;

CREATE TABLE groupe(
groupId int (11) Auto_increment NOT NULL ,
groupName Varchar (25) ,
PRIMARY KEY (groupId )
)ENGINE=InnoDB;

CREATE TABLE userGroup(
dtGroup Date ,
userid_user Int NOT NULL ,
groupId_groupe Int NOT NULL ,
projectid_projet Int NOT NULL ,
PRIMARY KEY (userid_user ,groupId_groupe ,projectid_projet )
)ENGINE=InnoDB;

ALTER TABLE userGroup ADD CONSTRAINT FK_userGroup_userid_user FOREIGN KEY (userid_user) REFERENCES user(userid);
ALTER TABLE userGroup ADD CONSTRAINT FK_userGroup_groupId_groupe FOREIGN KEY (groupId_groupe) REFERENCES groupe(groupId);
ALTER TABLE userGroup ADD CONSTRAINT FK_userGroup_projectid_projet FOREIGN KEY (projectid_projet) REFERENCES projet(projectid);[/mysql]

les tables user et projet tu les comprend facilement ;)
la table groupe (ou pour ne pas limiter la chose à binôme) contient un id et nom. elle permet aussi de regrouper les "user" (élève dans ton cas).
la table userGroup fait la liaison entre tous cela.
La clef primaire c'est une clef sur trois colonne.
Cela permet d'éviter d'avoir un "user" qui sont deux fois dans le même groupe pour le même projet (c'est gérer par les contraintes d'intégrité de la base).

donc lorsque que créer ton binôme tu ajoute une ligne dans groupe (et tu récupère l'id du groupe), puis deux lignes dans usergroup (une par élève) avec l'id groupe que tu viens de créer et et les id des utilisateurs et du projet que tu as obtenu grasse au formulaire ;)

LA chose peux te sembler tordue ou complexe, mais c'est quelque chose de solide, évolutif et flexible (même si le nom du groupe reste une contrainte).

si tu veux ta passer du nom du groupe il est tous à fait possible de supprimer la table groupe et d'ajouter dans usergroup une colonne pour le second "user" mais la du coup le système n'est pas évolutif et tu ne peux pas modifier le nombre de personne dans les groupe (ce qui reste un peu con quand même ;) ).

quand je regarde ton code je sais que la base ne sui pas un modèle précis, qu'il n'y a pas de respect des "normes" classique et que donc à un moment ou à un autre tu va t'en mordre les doigts.

Par exemple le fait de mettre les nom et prénom (etc) dans la table binôme, cela m'indique que tu va avoir plusieurs ligne "bob l'eponge" (par exemple).
mais aussi que cette ligne existe dans la table des élèves (et peux être ailleurs ?).
du coup si tu t'es gouré dans le nom qui est "bob léponge" il faut que tu modifie dans chaque table, pour l'utilisateur cela veux dire de passer sur tous les écrans ...
c'est fastidieux , contraignant etc.
si tu ballade une clef primaire tu ne modifie qu'a un seul endroit => gain de temps à l'utilisation mais aussi gain de temps en développement tu n'as pas copier coller le code modification de ses infos dans tous un tas de pages différentes ;)

et en plus tu respect, au moins, la 1ère régle de codd (atomicité des informations) :mrgreen:

si le sujet t'interesse un peu tu peux chercher un coup sur la modalisation merise (et plus particulièrement le modèle entité association), voir sur la modélisation avec UML.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

14 sept. 2013, 23:03

Bonsoir,
Merci Moogli pour ces schémas et tes explications. Je vais continuer à chercher comment écrire le code, j'ai eu un malheureusement un empêchement qui m'a retardé.
Je dois aussi résoudre d'autres problèmes de requêtes en pdo avant. Puis je reviendrai soumettre mon code en espérant avoir trouver d'ici là une solution adéquate.
A très bientôt
Ionesco

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 sept. 2013, 13:36

De rien.

Je peux sembler têtu mais c'est pour ton bien ;)

Bon courage

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

15 sept. 2013, 14:47

Au contraire, ta démarche est positive et j'en prends toute la mesure.
Cdlt
Ionesco