Update avec des cases à cocher (php / sql)

WRInaute discret
Bonjour,
je suis embêter avec une mise à jour de cases à cocher.
ça fait un bon moment que je fais des maj sur les boutons radio, listes déroulantes... mais le problème des cases à cocher vient d'être posé et tout s'embrouille dans ma tête :?...

Je vous explique rapidement.

J'ai une table ABONNE, SEGMENT et LIENSEGMENT
Un abonné peut être associé à plusieurs segment d'où le fait la table LIENSEGMENT qui rassemble l'ensemble de lien entre ces 2 tables.

LIENSEGMENT(num_lien, num_abo, num_seg);

J'arrive à afficher les segments liés à l'abonné mais comme je vous le disais pour mettre à jour c'est une autre paire de manche :) !

J'avais penser à la solution de tout effacer et tout réécrire mais bon pas très optimiser je trouve.

Voici ce que j'avais fait...merci de votre aide :)

Code:
$req_seg = mysql_query("SELECT num_seg FROM segment");

$req_lien_seg = mysql_query("SELECT num_seg
                             FROM liensegment
						     WHERE num_abo = ".$_GET['idabo']."
							 ORDER BY num_seg");

$nb_seg = mysql_num_rows($req_seg);
$nb_lien = mysql_num_rows($req_lien_seg);
			 
for ($i=1;$i<=$nb_seg;$i++) // on parcourt le nb de segment enregistré dans la base pour connâitre le nombre de boucle à faire.
   {
     for ($p=1;$p<=$nb_lien;$p++) // on parcour le nb de lien enregistré avec cet utilisateur
	    {
          if ($_POST['checkbox'.$i.''] <> mysql_result($req_lien_seg,($p-1),0)) //si on trouve la checkbox cochée associée à l'abo
	       {
		    // delete
	   	   }
		   
		  if ($_POST['checkbox'.$i.''])
		   {
		    // insert
		   }
         }		   
    }
 
WRInaute passionné
Une petite remarque, le "num_lien" de ta table "LIENSEGMENT" ne sert à première vue à rien du tout.
Tu devrais juste garder "num_abo" et "num_seg" et les mettre tous les 2 en clé primaire (afin que la liaison soit unique).

Ensuite, même si tu ne trouves pas ça optimisé, j'opterai quand même pour la suppression et un multi insert ensuite.

Ça ne va pas de générer de clé auto incrémenté étant donné que tu n'aura plus de "num_lien" et tu fais finalement moins de requete (une ou tu supprimes tout, et une ou tu insères tout).

Attention également à ton <num_abo=".$_GET['idabo']."> si ton $_GET n'est pas contrôlé, c'est une faille assez grossière et facile à détecter.
 
WRInaute passionné
Un algo :
Code:
listeCaseCochee = getCaseCochee(); ## ton formulaire quoi
listAbonnement = getListeAbonemment(); ## ce que tu as en base

Pour chaque abonnement de listAbonnement {
  Si non présent dans listeCaseCochee alors
     Suppression du lien
}
Pour chaque caseCochee de listeCacheCochee {
  Si non présent ans listAbonnement alors
    Création du lien;
}

Donc en gros tu auras un tableau des case cochées, un autre la liste des assos en base, tu regarde les différence pour créer ou supprimer ce qui a changé.
 
Discussions similaires
Haut