Récupérer plusieurs valeurs d'un même champ [Résolu]

Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
- - Dernière réponse : LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
- 13 oct. 2019 à 09:42
Bonjour, Je reviens encore une fois vers vous. Alors je vais essayé cette fois ci d'être très explicite enfin le mieux possible.
J'ai créé une table dans ma BDD qui me servira pour la gestion de classeurs.
De ce fait j'ai eu beau y tourner dans tous les sens il a fallu que je me résigne à insérer plusieurs valeurs dans un même champ pour pouvoir arrivé à mes fins.
Ma table pour faire simple.
cdc_classeurs (nom de la table)
idclass (auto incrémente)
idpers (tinytext relation avec ma table cdc_personnes)
J'ai créé un tableau pour stocker les noms des personnes et créé des cases à cocher en bouclant dessus.
Maintenant pour pouvoir UPDATER il faut récupérer et afficher les cases qui ont été sélectionnés lors de l'INSERT. Malheureusement si je fait un INSERT avec plusieurs case à coché aucune n'est retournée, par contre si je sélectionne une seule case lors de l'INSERT alors là c'est nickel ma checkbox est sélectionné alors je peux modifier cette case.
J'ai utilisé la fonction implode pour l'insertion et pour l'affichage peut-être qu'il faut utiliser explode et c'est là mon soucis je n'y suis pas parvenu.
En résumé: c'est là où je bloque car je n'arrive pas à ré-afficher plusieurs choix dans les checkbox
Je vous donne ma page complète. Je vous remercie.
$quant 	= date("z"); // Quantième du jour dans l'année. NB: le 01/09/AAAAA est le 245è jour de l'année
// Si l'on est avant le 01/09, l'année d'adhésion ($aadh) est l'année précédente, sinon c'est l'année courante
$aadh = $quant < 245 ? date("Y")-1 : date("Y"); 

$action 	= 'new';
$a 			= !empty($_GET['a']) ? $_GET['a'] : NULL;
$submit 	= !empty($_POST['submit']) ? $_POST['submit'] : NULL;
$haction 	= !empty($_POST['haction']) ? $_POST['haction'] : NULL;

$idclass 	= !empty($_REQUEST['idclass']) ? $_REQUEST['idclass'] : NULL;
$idpers 	= !empty($_POST['idpers']) ? $_POST['idpers'] : '';
$possession = !empty($_POST['possession']) ? $_POST['possession'] : NULL;

switch($a) {
	case 'new': $action = 'new';  break; 
	case 'ls' : $action = 'list'; break;
	case 'mod': $action = 'mod';  break;		
	default   : $action = 'new';  break; 
} 
if($submit) {
	
	switch($haction) {
	    case 'new':
		if(isset($possession) && is_array($possession)) {
			$check = implode(',',$possession);
			// Construction de la requete d'ajout
			$sql = "INSERT INTO cdc_classeurs (idpers) VALUES (:idpers)";
			$datas = array('idpers' => $check);
			$result = executeQuery($sql,$datas);
			$typenr = "enregistré"; 
			$reqaj = $sql;
			$sql = "SELECT *
FROM cdc_classeurs
LEFT JOIN cdc_personnes ON cdc_personnes.idpers = cdc_classeurs.idpers";
$result = executeQuery($sql,$datas);
$donnees = $result->fetch();
$success = "<span class='success'>Le classeur de ".$check." a été $typenr.</span>";
}
break;
		case 'mod':
		if(isset($possession) && is_array($possession)) {
			$check = implode(',',$possession);
					// Construction de la requete de modif
					$sql = "UPDATE cdc_classeurs SET idpers = :idpers WHERE idclass = :idclass";
					$datas = array('idpers' => $check, 'idclass' => $idclass);
					$result = executeQuery($sql,$datas);
					$typenr = "modififié"; 
					$reqmod = $sql;
					
				
					$success = "<span class='success'>Le classeur ".$check." a été $typenr.</span>";
				}
			
			break;
	}
}
switch($action) {
	case 'new':
		$title		= "Saisie des classeurs"; 
		$btsub		= "Enregistrer";
		$idclass    = "";
		$idpers		= "";
		break;
	
	case 'list':  					
		$title  	= "Liste des classeurs";
		break;

	case 'mod': 
		$title      = "Modification d'un classeur";
		$btsub      = "Modifier";
		$sql    	= "SELECT * FROM cdc_classeurs WHERE idclass = :idclass";
		$datas 		= array('idclass' => $idclass);
		$result 	= executeQuery($sql,$datas);
		$donnees 	= $result->fetch();
		$idclass    = $donnees->idclass;
		$idpers   	= $donnees->idpers;
		break;
}

mon formulaire
if($action == 'list') {
	echo '<h1>'.$title.'</h1>';
	
	$sql = "SELECT *
			FROM cdc_classeurs";
	$result = executeQuery($sql,$datas);
	
	echo '<ul>';

	while ($donnees = $result->fetch()) {
		$lien = $_SERVER["PHP_SELF"].'?a=mod&idclass='.$donnees->idclass;
		echo '<li> <a href="'.$lien.'">'.$donnees->idpers.'</a>';
	}
	echo '</ul>';

	// Ecrire bas de page et sortir : listage fini.
	echo dmaj("sais_classeur.php");
	echo "</div></body></html>";
	exit;
}
$checked = $idpers ? " checked " : "";
echo '<form method="post" name="cla" action="'.$_SERVER["PHP_SELF"].'" onsubmit="return verif()">';
	echo '<h1>'.$title.'</h1>';
		$sql = "SELECT cdc_adherer.idpers, nom, prenom
			FROM cdc_adherer
				LEFT JOIN cdc_personnes ON cdc_personnes.idpers = cdc_adherer.idpers
			WHERE annee = :annee
			AND cdc_adherer.idclas IN (3,4)
			ORDER BY nom,prenom";
		$datas = array('annee' => $aadh);
		$result = executeQuery($sql,$datas);
		while ($donnees = $result->fetch()) {
echo '<input type="checkbox" name="possession[]"'; if($donnees->idpers == "$idpers") echo $checked; echo 'value="'.$donnees->idpers.'" />';echo '<label> '.$donnees->nom.' '.$donnees->prenom.'</label><br/>';
		}
		echo '<input type="hidden" name="haction" value="'.$action.'" />';
		echo '<input type="hidden" name="idclass" value="'.$idclass.'" />';
	echo '</td>';
	echo '</tr>';
	echo '</table>';
	echo '<td class="data"><input type="submit" name="submit" value="'.$btsub.'" /></td>';
	echo '</div>';

echo '</form>';
Afficher la suite 

11 réponses

Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832
0
Merci
Ton code est toujours aussi brouillon.... et tes explications complètement incompréhensibles..
Mais bon... j'aurai beau te le dire à chacun de tes messages, je pense que ça ne sert à rien..

On a du mal à comprendre si ton souci est lors de l'insertion en base de données ..... ou lors de l'affichage des données insérées sur ta page.

Au départ j'ai pensé à un souci d'insertion en base.... mais après une bonne vingtaine de relecture je penche finalement sur un souci d'affichage.
Et plus exactement.. un problème de jointure dans ta requête

En effet... .. la structure de ta table

Ma table pour faire simple.
cdc_classeurs (nom de la table)
idclass (auto incrémente)
idpers (tinytext relation avec ma table cdc_personnes)

n'est pas bonne. ( je te l'ai déjà dit à plusieurs reprises dans tes différentes discussions )

Tu ne peux pas mettre plusieurs ID dans un seul champ idpers et faire des jointures dessus !!!!

Donc, une dernière fois, je te le redis.... tu dois faire une table de relation supplémentaire.. !
Et vu les erreurs que tu commets lorsque tu conçois ta base de données (et ton code en général...) je serais toi.. je commencerai par suivre des tutos adaptés à ton niveau.

A commencer par un bon cours sur les bases de données relationnelles....

Pour rappel.. le 12 octobre 2018 (et oui.. déjà un an ) tu planchais déjà sur ce bout de code et tu avais indiqué que tu allais revoir la structure de tes tables
Discussion visible ici : https://www.commentcamarche.net/forum/affich-35620214-recuperer-les-valeurs-des-checkboxs#10
Tu n'as guère progressé visiblement....





Commenter la réponse de jordane45
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour, C'est exact comme tu l'a souligné il y a un an j'avais fait cette gestion de classeurs avec des relations entre tables quelques choses de structuré. Et au fil du temps je me suis aperçu que je ne pouvais gérer cela de façon conventionnel. Alors j'ai repris un classeur Excel et j'ai fait ma gestion avec. Et aujourdh'ui j'aimerai reprendre cette gestion de façon dynamique. Mais voilà il y a un hic....
Je suis obligé d'insérer plusieurs valeurs dans un même champ sql. je sais que c'est une très mauvaise idée mais dans mon cas je n'ai pas le choix. Je posterai prochainement mon soucis.
Cordialement.
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -

Je suis obligé d'insérer plusieurs valeurs dans un même champ sql

Tu es OBLIGE ?
Par qui ? Pourquoi ?


je sais que c'est une très mauvaise idée

Ce n'est pas une "mauvaise" idée.... c'est une très très très très mauvaise façon de faire !
Sais tu ce qu'est une Base de données relationnelle et comment la concevoir et l'utiliser ? J'en doute vu tes questions....

mais dans mon cas je n'ai pas le choix

Ah bon ? Comme pour ma première question... qui t'y oblige ? Pour quells raisons ? Qu'est-ce qui t'en empeche réellement ?

Tu ne peux pas ( ne dois pas..) juste prendre tes feuilles excel est esayer de les reproduire dans ta BDD ...
Excel est un tableur.. pas un système de gestion de base de données... tu ne dois donc pas t'en inspirer pour concevoir ta base.
Pour faire une base.. on peut stocker toutes les valeurs dans autant de tables et de champs qu'on le souhaite... il faut juste rester logique et cohérent avec le fonctionnement d'une base relationnelle....
Et avec ta structure actuelle de base tu es loin d'être en accord avec une bdd relationnelle et tu ne pourras JAMAIS réaliser ce que tu souhaites.

Donc.. avant de commencer à coder (ou de continuer dans ton cas)... forme toi sur les bases de données relationnelles et essaye de concevoir un MCD cohérent.
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour, Avant toute chose je sais très bien ce que c'est un classeur Excel c'était simplement pour dire que je gére cela sur papier si tu préféres, je ne suis pas très doué mais quand même. J'ai réalisé une partie administration dont je suis pas mécontent de moi. J'ai fait l'achat de livres sur PHP/MYSQL et je ne serai jamais un pro comme tu l'est mais j'avance quand même à mon niveau.
Je donne des cours de musique BENEVOLEMENT heureusement qu'avec mes élèves, que je ne suis pas aussi intransigeant que tu l'est avec moi. Merci en tout cas pour l'aide que vous apporter.
Je continue dans mes recherches.
Salutations.
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Je pense que si un de tes élèves te dit qu'il doit impérativement jouer du piano aves ses pieds..sans te doner une raison valable...tu risques de tout faire pour le corriger..
Moi c'est pareil avec ta structure de table...
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Je précise également que moi aussi... j'interviens sur ce forum BÉNÉVOLEMENT...

Le problème étant que tu ne réponds pas à nos questions et que tu sembles t'obstiner dans ta façon de faire au lieu d'essayer de comprendre comment ça fonctionne réellement...
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour, Alors en ce qui concerne mon soucis.
Il faut que je gère la gestion des classeurs dans lequel sont classé les partitions de musique pour chaque musiciens.
Chaque classeur à bien entendu 1 catégorie (pupitre)
Pour que cela soit plus limpide.
Moi j'ai un classeur de la catégorie Saxophone.
Mes deux compères se partagent un classeur de la catégorie Saxophone également.
Alors tu me dira et pourquoi vous n'avez pas chacun un classeur? cela simplifierai la chose.

J'avais fait mes relations des tables de la façon suivante.
cdc_personnes
idpers AUTO_INCREMENT
nom
prenom
cdc_classeurs
idpers
idpup
cdc_pupitres
idpup AUTO_INCREMENT
pupitre

Avant d'aller plus loin donne moi tes impressions, même si je redoute le pire.
Merci.
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Tu as donc trois tables...

Table cdc_personnes
idpers AUTO_INCREMENT
nom
prenom

Table cdc_classeurs
idpers
idpup

Table cdc_pupitres
idpup AUTO_INCREMENT
pupitre


La table cdc_classeurs étant donc la table de jointure entre cdc_personnes et cdc_pupitres ?
Jusque là, tout est bon.
Bien entendu, tu peux avoir dans cette table autant de lignes 'user/pupitre' que necessaire.

Imaginons que tu aies un utilisation dont l'id est "1"
Et qu'il soit rattaché aux classeurs 1,2,3,5

Dans ce cas, dans ta table cdc_classeurs tu auras 4 lignes
1 | 1
1 | 2
1 | 3
1 | 5
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour,
Déjà un utilisateur a 1 seul classeur donc dans ton exemple l'ID 1, ne peut avoir 4 classeurs, et 1 classeur à 1 utilisateur ou plusieurs
Mais imaginons comme c'est le cas que deux utilisateur dont l'ID est le 2 et 5 et qu'ils se partagent le même classeur 3.
Un autre utilisateur dont l'ID est le 1 à le classeur 3
voici la correspondance:
classeur = pupitre
pupitre = saxophone ou trompette ou guitare ou piano etc...

2 | 3
5 | 3
1 | 3

Comment je vais pouvoir faire pour savoir entre l'ID 1 et 2 et 3 qui se partagent le même classeur? c'est très important pour cette gestion.
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Erreur d'écriture de ma part
A la place de

Imaginons que tu aies un utilisation dont l'id est "1"
Et qu'il soit rattaché aux classeurs 1,2,3,5

Il fallait lire

Imaginons que tu aies un utilisation dont l'id est "1"
Et qu'il soit rattaché aux pupitres 1,2,3,5


Ensuite

Déjà un utilisateur a 1 seul classeur

Dans ce cas... il te manque un champ pour faire le lien entre une personne et un classeur.
Si tu as une liaison 1 personne -> 1 classeur il faut dans ce cas ajouter, dans ta table cdc_personnes un champ 'id_classeur'
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 > jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
-
D'ailleurs il semble qu'il manque un champ "id" pour ta table cdc_classeur.
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Pourrais tu lister TOUTES les tables de ta BDD et indiquer les relations qu'il y a entre chacune d'elles ?

On sait déjà qu'un cdc_personnes est lié à 1 cdc_classeur
Donc pour ces deux tables on devrait avoir :

cdc_personnes
idpers AUTO_INCREMENT
nom
prenom
idclass 


cdc_classeurs
idclass AUTO_INCREMENT
idpers
idpup


Et la table cdc_adherer ? elle sert à quoi ? Elle est liée à quelle autre table ? Quelle cardinalité ( 1:1 1:n n:n ? )
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour,
La table cdc_adherer est une table de relation
idpers => ID de la personne
idpaie =>ID du paiement
idclas => ID de la classe
annee => Année de cotisation 
ddebut => Date de début d'adhésion de l'adhérent
dfin => Date de démission de l'adhérent
montant => Montant annuel payé

Alors cela donnerai donc:
table cdc_personnes
idpers AUTO_INCREMENT
nom
prenom
idclass

table cdc_pupitre
idpup AUTO_INCREMENT
pupitre

table cdc_classeurs
idclass AUTO_INCREMENT
idpers
idpup

Mais qu'en est-il => 1 classeur à 1 utilisateur ou plusieurs => 1:n
C'est flou pour moi je suis en train de mettre tout ça sur papier pour voir.
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Imagine qu'il y ait 5 personnes et 3 classeurs
Les personnes 1 et 5 partagent le classeur 3
Les personnes 3 et 4 le classeur 2

ça donnerait :


Donc 1 personne attachée à 1 classeur
1 classeur attaché à 0 ou n personnes
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Oui cela commence à être moins confus.
Est-il possible au lieu de rajouter un champ dans la table cdc_personnes si je cré en plus une nouvelle table par exemple:
cdc_possession
idpers
idclass
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
Si tu veux.
cela te permettra en plus de pouvoir gérer plusieurs classeurs pour une même personne si tu en as besoin.

Par contre, il est recommandé, même si ce n'est pas une obligation, d'avoir un id Autoincrementé dans chaque table.. y compris celle là.
Cela permet d'administrer plus facilement la table lors de delete ou d'update.
(tu le verras si jamais tu essaye de supprimer la ligne via phpmyadmin par exemple )
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Je vais créé mes tables et voir tout cela de façon réel car il y a encore une petite chose qui me chagrine mais je suis pas sur.
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour, je reviens vers toi car j'ai commencé à faire mes requètes INSERT et le résutat n'est pas ce que j'espèrais par rapport à ta capture d'écran que tu as fait.
ma table cdc_classeur


et ma table cdc_posseder
jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 -
En effet,
Le champ idpers ne devrait pas être dans la table cdc_classeur... c'est une erreur de copier/coller de ma part.

jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
1832 > jordane45
Messages postés
26519
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 octobre 2019
-
je me suis basé sur ce que tu as essayé de nous expliquer.
Donc en partant du principe qu'il peut y avoir 1-->n pupitre par classeur ?

A mois que LE pupitre soit lié à l'utilisateur ?

pourrais tu nous expliquer le lien que tu souhaites avoir entre chaque élément ?
Combien de classeur par Utilisateur ? ( ça tu nous as déjà dit 1 utilisateur est rattaché à 1 classeur )
Combien de Pupitre par classeur ? ( et/ou par utilisateur peut-être ? )
Sinon à quoi sert la table cdc_classeur..... ?

NB: Tous les champs "id" sont de type auto-incrément.
Pas besoin, dans chaque table.. d'indiquer iddequoi
Si tu es dans la table cdc_personne... on se doute que le champ "id" c'est idPers ....
Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Relation entre éléments:
1 => n utilisateur par classeur
1 => 1 pupitre par classeur

Un classeur à 1 ou plusieurs utilisateurs
Un classeur a un pupitre
Un pupitre à un ou plusieurs classeur

Exemple de tables mais c'est simplement pour te donner une idée sur les relations des IDs qu'il faudrait.
Mais à propos de la tables cdc_classeurs il manque une table de relation.
C'est pour te montrer dans la table cdc_classeurs que les idpers ont le même pupitre et que idpers1 et idpers2 se partage le même classeur et idpers3 il a un classeur individuel.

La structure que tu a faites me semble peut-être cohérente mais je n'en suis pas sur. Par contre dans la table cdc_adherer il y a déjà idpers.
Excuse moi ça c'est peut-être pas très clair mes explications mais je ne peux pas faire mieux.

cdc_personnes
idpers   nom
1             pierre
2              paul
3              jacques

cdc_pupitres
id        pupitre
1          guitare
2          piano                

cdc_classeurs
id          idpers          idpup
1               1                   2
1                2                  2
2                 3                 2

Commenter la réponse de LaChaux78
Messages postés
395
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
13 octobre 2019
3
0
Merci
Bonjour, J'ai résolu totalement mon problème. Je vous remercie.
Commenter la réponse de LaChaux78