checkbox et mise à jour d'une table

Petit nouveau ! | 4 Messages

12 janv. 2006, 20:43

bonsoir,
voila mon pb, l'idée est de pouvoir modifier l'inscription d'individus à des groupes, sachant que :
- Un individu peut appartenir à plusieurs groupes
- le nombre de groupes peut évoluer.
J'ai donc créé 3 tables :
contact (id_contact, nom, prenom...) qui regroupe les individus
grp (id_grp,nom_grp) qui regroupes les différents groupes
grp_contact (id_grp_contact, id_contact, id_grp) qui stocke l'affiliation des individus aux différents groupes.

j'arrive à insérer des contacts et les affilier à des groupes. Par contre je bute sur la modification des affiliations.

j'ai creer le formulaire permettant d'afficher l'appartenance de chaque individu aux groupes auxquels il appartient à l'aide de checkbox:
<?php
echo "<form action=\"modif_inscr_grp2.php\">\n";
echo "<input type=hidden name=\"id_contact\" value=$id_contact>\n";

//récuperation de tous les groupes 
$sql = "SELECT id_grp, nom_grp FROM grp ORDER BY nom_grp ASC"; 
$req = mysql_query($sql) or die(mysql_error().$sql); 

while($data = mysql_fetch_assoc($req)) { 
//On va voir si ce groupe est selectionné 
$sql = "SELECT * FROM grp_contact WHERE id_contact = $id_contact AND id_grp = ".$data['id_grp']; 
$req2 = mysql_query($sql) or die(mysql_error().$sql); 
$checked = mysql_num_rows($req2) > 0; 

//On affiche la checkbox 
echo '<div>'; 
echo '<input type="checkbox" 
name="grpsel[]" id="grpsel_'.$data['id_grp'].'" 
value="'.$data['id_grp'].'"
'.($checked?'checked="checked"':'').' />'; 
echo '<label for="grpsel_'.$data['id_grp'].'">'.$data['nom_grp'].'</label>'; 
echo '</div>';
}
echo "<input type=submit value=\"Modifier\">";
echo "</form>"; 
?>
la page "modif_inscr_grp2.php" devant faire la mise à jour se présente ainsi :
<?php
require_once(...); 
mysql_select_db($..., $...);

$id_contact = $_GET["id_contact"];
$id_grp = $_GET["grpsel"];

if($id_grp) {
for ($i=0; $i<count($id_grp); $i++) {
$result=mysql_query("UPDATE grp_contact SET id_grp='$id_grp[$i]' WHERE id_contact='$id_contact'"); 
if (!$result) { 
echo "La mise à jour a échoué. Essayez plus tard<br>"; 
} else { 
header('Location: contact_details.php?id_contact='.$id_contact.''); 
}
}
}
mysql_close(); 
?>
mon pb c'est qu'un simple update dans la table grp_contact ne me permet pas de supprimer et/ou d'ajouter des groupes pour un individu dans cette même table.
J'espère que je suis assez clair.
Quelqu'un aurait des suggestions ?
Merci d'avance.

Mammouth du PHP | 19672 Messages

12 janv. 2006, 21:09

Au départ, pourquoi faire deux requêtes successives donc la seconde en boucle pour extraire les données ? Tu pourrais le faire avec une jointure en une seule requête, ce sera infiniment plus efficace : il faut simplement savoir que tu risques d'avoir plusieurs lignes pour certains individus affiliés à plusisurs groupes.

Ensuite, si tu modifies l'appartenance d'un individu à un groupe, la mise à jour n'a en principe lieu que dans la relation entre la table individu et la table groupe, donc la table grp_contact : puisque modifier une affiliation ne modifie ni l'individu lui-même, ni le groupe lui-même. Pour la mise à jour, il te faut connaître l'identifiant de l'individu, l'identifiant de l'ancien groupe et celui du nouveau groupe.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 4 Messages

12 janv. 2006, 23:38

salut cyrano,
j'ai oublié de préciser dans le code que l'id_contact est recupéré :
<?php
$id_contact = $_GET["id_contact"];
 
echo "<form action=\"modif_inscr_grp2.php\">\n"; 
echo "<input type=hidden name=\"id_contact\" value=$id_contact>\n"; 

//récuperation de tous les groupes 
$sql = "SELECT id_grp, nom_grp FROM grp ORDER BY nom_grp ASC"; 
$req = mysql_query($sql) or die(mysql_error().$sql); 

while($data = mysql_fetch_assoc($req)) { 
//On va voir si ce groupe est selectionné 
$sql = "SELECT * FROM grp_contact WHERE id_contact = $id_contact AND id_grp = ".$data['id_grp']; 
$req2 = mysql_query($sql) or die(mysql_error().$sql); 
$checked = mysql_num_rows($req2) > 0; 

//On affiche la checkbox 
echo '<div>'; 
echo '<input type="checkbox" 
name="grpsel[]" id="grpsel_'.$data['id_grp'].'" 
value="'.$data['id_grp'].'" '.($checked?'checked="checked"':'').' />'; 
echo '<label for="grpsel_'.$data['id_grp'].'">'.$dat['nom_grp'].'</label>'; 
echo '</div>'; 
} 
echo "<input type=submit value=\"Modifier\">"; 
echo "</form>"; 
?>


au depart je fais 2 requetes pour que tous les groupes s'affichent sous forme de checkbox et que seuls les groupes auxquels est déjà affilié l'individu sélectionné ($id_contact) soit cochés.
Le formulaire fonctionne bien, il me retourne bien tous les groupes en cochant ceux déjà attribués à l'individu.

C'est la partie mise à jour sur laquelle je bute.
il faut que je récupère les enregistrements existants de la table grp_contact correspondant à l'id_contact afin que ceux déjà cochés restent tel quel, ceux nouvellement cochés soient ajoutés et ceux décochés soient supprimés.
Et là j'avoue que je nage... comment puis-je m'y prendre ?

Petit nouveau ! | 4 Messages

13 janv. 2006, 19:07

besoin d'aide svp...
peut-être ma question n'est pas très claire...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 janv. 2006, 20:09

une idée rapide serait de supprimer les enregistrements correspondant à cet individu de la table "grp_contact" ceux ayant le meme id_contact que le membre.

Puis de recrée les enregistrements avec les nouveaux clubs séléctionnées en fonction des cases.


Sinon il faudrait faire plusieurs requetes de séléction (SELECT) pour retrouver les club auquels le membre est inscrit puis une requete de suppression (DELETE) pour enlever les groupes dont les cases sont décochées et une autre de mise ajour (UPDATE) pour les nouveaux groupes auquels il n'as pas encore été inscrit.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Petit nouveau ! | 4 Messages

14 janv. 2006, 01:10

Merci truc,
j'ai fait selon ta suggestion et à present la page effectuant les modifs ressemble à ça :

Code : Tout sélectionner

<?php require_once("..."); mysql_select_db($..., $...); $id_contact = $_GET["id_contact"]; $id_grp = $_GET["grpsel"]; $del=mysql_query("delete from grp_contact where id_contact='$id_contact'"); if($id_grp) { for ($i=0; $i<count($id_grp); $i++) { $result=mysql_query("INSERT INTO grp_contact (id_grp_contact,id_grp,id_contact) values('','$id_grp[$i]','$id_contact')"); if (!$result) { echo "La mise à jour a échoué. Essayez plus tard<br>"; } else { header('Location: contact_details.php?id_contact='.$id_contact.''); } } } mysql_close(); ?>
et ça semble fonctionner comme prévu.
Merci pour le coup de main.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 janv. 2006, 01:51

j'ai un peu retouché tout ça, j'ai mis de commentaires et des explication à la fin:
<?php
require_once("...");
mysql_select_db($..., $...);

$id_contact = $_GET["id_contact"];
$id_grp = $_GET["grpsel"];

if($id_grp) 
{
	$sql="INSERT INTO grp_contact (id_grp,id_contact) values "; //initialisation de la requete	
	$values=""; // initialisation de la partie concernant les values de la requete

	foreach ($id_grp as $val)
	{
	   $values .="(".$val.",".$id_contact."),"; // construction de la fin de la requete avec les values
	}

	$sql="INSERT INTO grp_contact (id_grp,id_contact) values " .$values; // construction de la requete d'insertion multiple
	// => en sortie INSERT INTO grp_contact (id_grp,id_contact) values (1,2),(3,2),
	
	$sql=substr($sql,0,-1); // suppresion de la dernière virgule de trop	
	
	$result=mysql_query($sql);
	
	if (!$result) 
	{
		echo "La mise à jour a échoué. Essayez plus tard<br>";
	} 
	else 
	{
		$dernier_id=mysql_insert_id(); // récupération du dernier id autoincrémenté de id_grp_contact
		$nb=count($id_grp); // nombre total de nouvelles insertions
		
		$id=$dernier_id-$nb; // id avant les nouvelles insertions
		
		// suppresion des données d'un membre donné ($id_contact) et dont les enregistrements sont inferieurs au nouveaux crées
		$sql_del="delete from grp_contact where id_contact=$id_contact AND id_grp_contact < ".$id;
		
		mysql_query($sql_del);
		
		header('Location: contact_details.php?id_contact='.$id_contact.'');
	}
	
}
     mysql_close();
?>
alors j'ai ajouté une requete à insertion multiple ce qui evite d'exécuter autant de requetes qu'il y a de cases cochées.

Code : Tout sélectionner

INSERT ... values (..),(..),(..)
ensuite une suppresion qui ne se fait que si les insertions se sont bien éffectués (experimental, garde ton code sous le coude :wink: ), tu me diras s'il y a un problème.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute