Page 1 sur 3

Table intermediaire et SQL

Posté : 08 oct. 2005, 10:07
par bunk
Bonjour,

J'utilise ACCESS de Microsoft depuis un moment ou j'utilise avec aisance les tables intermédiaire dans le cas dune relation n,m

Je suis confronté a un problème de taille car a priori ce n'est pas géré pareil par SQL donc je suis perdu avec mon code PHP

J'ai trouvé plusieurs site traitant du sujet mais n'affiche d'autre exemple qu'avec un SELECT, a croire qu'il est impossible d'insérer des données dans un modèle avec table intermédiaire.

Donc en fait je suis à la recherche d'information (si possible avec exemple)

D'avance merci

Posté : 08 oct. 2005, 10:20
par Cyrano
C'est à priori plus un problème de SQL que de PHP, mais dans le doute pour l'instant, je vais laisser le sujet ici.

Est-ce qu'on peut avoir une idée de la structure de tes tables et une illustration sommaire de ce que tu voudrais faire au juste ? Si tes tables "intermédiaires" sont des "relations", ça ne devrait pas poser de problème majeur, mais là, impossible de deviner.

Posté : 08 oct. 2005, 10:44
par bunk
Alors voila c'est vrai que je n'ai pas donné beaucoup d'informations.

Voila mon MPD :

Image

Pour le moment je suis sur la partie ajout de groupe (qui fonctionne seul) je voudrais y associer des droits (table droit)

En fait le problème c'est l'ecriture des requetes pour effectuer ces taches.

Merci d'avance pour l'aide

Posté : 08 oct. 2005, 10:52
par Cyrano
Tu vas avoir deux requêtes d'insertion et deux requêtes de récupération d'ID;
- l'insertion dans la table groupes suivie de la récupération de l'identifiant généré pour le nouveau groupe;
- la récupération de l'identifiant du droit (ou des droits) à accorder au groupe inséré;
- l'insertion dans la relation de la paire (ou des paires) id_groupe/id_droit

Posté : 08 oct. 2005, 10:57
par bunk
bon alors je suis pas sur d'être capable de faire tout ca mais je vais essayé, merci

Posté : 08 oct. 2005, 10:59
par Cyrano
Ce que j'indique, c'est lordre des requêtes: si tu essayes d'alimenter une table de relation avant, dans le cas où tu aurais activé l'intégrité référentielle, MS-Access va te jeter.

Posté : 08 oct. 2005, 18:33
par bunk
Bonsoir,

Alors maintenant que j'ai compris comment je devais procéder je suis confronter a des erreurs de conceptions (c'était à prévoir) a cause d'une fonction implode que je ne parviens pas a transformer en implode.

La liste des droit est récupéré par le biais de case a coché et donné sous la forme droit_1;droit_2;droit_3

Donc d'après ce que j'ai lu il faudrait faire un array pour récupérer et dissocier la valeur de chaque case coché :

Pour le moment je récupère les valeurs des cases a coché comme suit :

Code : Tout sélectionner

// Récupération des cases à cocher $options = $_POST['options']; //Contenu des cases à cocher $options_text = implode(";",$options);
Maintenant pour faire une requête qui récupère les ID des droits sélectionné il faut séparer les valeurs obtenues et les distinguées.
Lorsque que j'essai avec explode au lieu de implode il n'affiche que Array a priori a cause de l'echo


Pouvez-vous m'aider ?
D'avance merci

Posté : 08 oct. 2005, 18:53
par Truc
SAlut, tu y était presque:
// Récupération des cases à cocher
$options = $_POST['options'];            //Contenu des cases à cocher
$options_text = explode(";",$options); 
utilise donc un explode pour séparer les différentes valeurs et le array se construit tout seul.

si tu as a chaque fois 3 types droits dans $_POST['options']
tu les récupère ainsi:
$options_text[0]// droit 1
$options_text[1]// droit 2
$options_text[2]// droit 3
si le nombre de droits varie
foreach($options_text as $droit)
{
   echo 'droit = '.$droit;
}

Posté : 08 oct. 2005, 19:18
par bunk
Merci Truc,

Effectivement j'en était arrivé (apres multiple lecture) a ta première solution, le fait est qu'il ne me retourne pas les valeurs comme il devrait mais affiche que Array

je récupère mes valeurs coché comme ca :

Code : Tout sélectionner

$options = $_POST['options']; //Contenu des cases à cocher $options_text = explode(";",$options);
ca me retourne Array

Si j'ecris comme ca :

Code : Tout sélectionner

$options = "test1;test2;test3"; //Contenu des cases à cocher $options_text = explode(";",$options);
il me retourne ca : droit = test1droit = test2droit = test3
inconvenient c'est en dur

Peux être que je n'utilise pas la bonne méthode de récupération ?

Merci

Posté : 08 oct. 2005, 19:30
par Truc
Peux être que je n'utilise pas la bonne méthode de récupération ?
peut tu nous montrer le code correspondant aux input (cases a cocher)...
je pense que tu récupère deja sous forme de tableau les cases cochée, et donc il suffirai de faire ceci (sans explode):
$options = $_POST['options'];
foreach($options_text as $droit)
{
   echo 'droit = '.$droit;
}
mais en attendant montr un bout de code.

Posté : 08 oct. 2005, 19:36
par bunk
oui j'aurais pu le mettre avant :

Code : Tout sélectionner

// Création de la boucle pour les case a cocher while($data = mysql_fetch_array($req1)) { echo $data['DROIT_GROUPE'] . "<input name=\"options[]\" type=\"checkbox\" id=\"options[]\" value=".$data['DROIT_GROUPE']."><br>"; } ?>

Posté : 08 oct. 2005, 19:44
par Truc
Donc tu récupère effectivement deja un tableau regroupant les cases cochées dans $_POST['options'].

Pour la suite si j'ai bien compris c'est dans le value="droit_1;droit_2;droit_3";

essai avec cette boucle
$options = $_POST['options'];
foreach($options as $droit)
{
   $droit = explode(";",$droit);
   // si tu as toujours 3 droits dans chaque valeur de case a cocher
   echo 'droit_1= '.$droit[0].' droit_2= '.$droit[1].' droit_3= '.$droit[2].'<br>'; 
}

Posté : 08 oct. 2005, 19:58
par bunk
Bon, j'ai une erreur qui n'apparait que lorsque le tableau est vide
Warning: Invalid argument supplied for foreach()
mais cela semble fonctionner, je test le script en local avec easyphp 1.8.0.1 ca doit venir de la.

je vais fouiller encore

Merci pour votre aide

Posté : 08 oct. 2005, 20:08
par Truc
pour eviter ce message d'erreur lorsqu'il n'y a pas de case cochée (donc pas de variable $_POST['options'] )... il te suffit de tester son existence avant de faire les operations dessus :wink:

Posté : 08 oct. 2005, 20:56
par bunk
Après toute ces modifications je sens que je suis pas loin d'avoir résolu mon problème, cependant j'ai encore quelque problème sur les 2 derniers points :
Tu vas avoir deux requêtes d'insertion et deux requêtes de récupération d'ID;
- l'insertion dans la table groupes suivie de la récupération de l'identifiant généré pour le nouveau groupe;
- la récupération de l'identifiant du droit (ou des droits) à accorder au groupe inséré;
- l'insertion dans la relation de la paire (ou des paires) id_groupe/id_droit
Je recupère l'ID des droits selectionnés dans les cases à cochés mais l'insertion dans la table intermediaire reste dificile.

Je ne suis pas certains de proceder comme il faut mais apres recupération de /des ID_DROIT je souhaite les inserer en concordance avec l'ID_GROUPE

premièrement j'ai une erreur a l'insertion mais je pense qu'il y'a une erreur avant car si je fais un echo juste avant cette dernière insertion il ne m'affiche que le dernier ID_DROIT selectionné precedement, j'en conclu que même sans l'erreur je n'arriverais a inserer qu'un couple (ID_GROUPE/ID_DROIT) dans ma table.

Voila mon bout de code :
// Récupération de/des ID droit
		foreach($options as $droit)
		{
		$sql2 = "SELECT * FROM gesten_utilisateur_droit WHERE DROIT_GROUPE = '$droit'";
		$req2 = mysql_query($sql2) or die('Impossible de visualiser les droits'); 
		$data = mysql_fetch_array($req2);
		$id_test = $data['ID_DROIT'];
		}

		// Insertion du/des couples GROUPE/DROIT
		$sql3 = "INSERT INTO gesten_utilisateur_groupe_droit (ID_GROUPE, ID_DROIT) VALUES('$id_groupe','$id_test)";
		mysql_query($sql3) or die('Impossible d\'inserer le couple id_groupr/id_droit');
Pour le test Truc en fait je le faisais déjà mais dans le bon fichier, les codes collé precedement provenanit d'une page de test, ce problème est résolu.

D'avance merci