PHP suppression

Résolu
Rominus Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -  
Rominus Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je me casse la tête depuis pas mal de temps.
je suis en train de faire une petite application avec 3 tables, et maintenant j'essaie de supprimer les enregistrements correspondant à ma recherche.
voici mes trois tables examens, motscles et avoir
la tables avoir permet de faire le lien entre la table examens et motscles, le problème est que dans je supprime un examen je veux aussi supprimer les mots-clés correspondant.
j'arrive très bien a supprimer l'examen et le lien dans avoir mais pas a supprimer les mots clés comment faire
je vous remerci de vos réponse d'avance

je vous met le MLD
examens (numexamens, nomexmens, lienexamens)
motscles (nummc, nommc)
avoir (numexamens#, nummv#)
A voir également:

5 réponses

freto Messages postés 1543 Date d'inscription   Statut Membre Dernière intervention   162
 
Bonjour.

motscles (nummc, nommc)
avoir (numexamens#, nummv#)

Y a pas une tite faute? Dans avoir, ce n'est pas plutot nummc#?
Fait attention que dans tes tables, tes champs soient bien nommés, ou que tu appelle bien les bons champs dans tes requetes.

Si tu nous donne le code que tu a pour supprimer, on pourra plus t'aider.
Sinon, tel qu'énoncé, je peut te donner un algo rapide:
recupérer l'id de l'exam a supprimer ($id=...)
sélectionner l'ensemble de la table avoir, avec l'id exam=ce que tu vient de récup ("SELECT * FROM AVOIR WHERE numexamen='$id'")
parcours de la liste de la sélection (while ($ligne=mysql_fetch_array($res)...)
récupérer l'identifiant de motsclés courrant ($idMotsCles=$ligne[0];)
le supprimer dans la table ("DELETE FROM motscles WHERE nummc='$idMotsCles'")
finparcours ( } )
supprimer les lignes dans avoir ("DELETE FROM AVOIR WHERE numexamen='$id'")
supprimer l'examen (DELETE FROM EXAMEN....)
0
Rominus Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
désolé faute de frappe
j'appelle une requête en faite car je travail sur plusieurs feuille, cette requête me renvoie les numéro des mots-clés

$num = $_POST["numero"] (qui est récupéré sur un formulaire sur une autre page qui est l'id de l'examens

$mc = "SELECT motscles.nummc FROM avoir, motscles WHERE avoir.nummc=motscles.nummc AND numexamens=$num",
$res = myqsl_query($mc);

while ($row = mysql_fetch_row($res)
{
echo "$row[0]";
}

voila le code pour la récupération des id des mots-clés
0
freto Messages postés 1543 Date d'inscription   Statut Membre Dernière intervention   162
 
Niarghh, jsuis pas fan du mysql_fetch_row...
Je te la reformule en mysql_fetch_array si sa ne te dérange pas ^^
Et au passage, je corrige les fautes suivantes:
Manque le ; a la fin de la déclaration de ton $mc.
Dans ta requete, pas oublier d'encadrer la variable avec des '
Ajout lors du mysql_query d'un paramètre $link, que tu devra créer auparavant avec un truc du genre
$link=mysql_connect("localhost","user","password") or die (mysql_error());
mysql_select_db("dbname",$link) or die (mysql_error());
En remplacant bien entendu "localhost" par le nom de l'hote qui a la bdd (mais sa devrait pas trop changer), "user" par le nom d'utilisateur pour la connection bdd, "password" par le mot de passe de l'utilisateur à la bdd, et "dbname" par le nom de la base de données.

Ajout des quelques mots or die (mysql_error()) à chaque exécution de requete pour un éventuel débuggage.
Correction au niveau de ta boucle while : il manquait une ).
Et certes, echo "$row"; sa fonctionne mais suis pas aussi sur pour un echo "$row[0]"; donc dans le doute, faire un $valeur=$row[0]; puis un echo "$valeur"; pour être sur.
Une fois corrigé, sa ressemblera presque à sa (j'ai pas tout remis).

$mc = "SELECT motscles.nummc FROM avoir, motscles WHERE avoir.nummc=motscles.nummc AND numexamens='$num'";
$res = myqsl_query($mc,$link) or die (mysql_error());

while ($row = mysql_fetch_array($res))
{
$nummc=$row[0]; //contient bien dans ce cas le nummc

$reqDelete="DELETE FROM motscles WHERE nummc='$nummc'";
$res=mysql_query($reqDelete,$link) or die (mysql_error());
} 

0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257 > freto Messages postés 1543 Date d'inscription   Statut Membre Dernière intervention  
 
$nummc=$row[0]; //contient bien dans ce cas le nummc

Tant qu'à faire d'utiliser mysql_fetch_array "pour bien récupérer le nummc", autant utiliser le tableau associatif.

$nummc = $row['nummc'];



Ceci dit, l'utilisation de sous-requête est quand même plus rapide à l'éxécution que de parcourir un tableau et de relancer une requête pour chaque suppression.
0
freto Messages postés 1543 Date d'inscription   Statut Membre Dernière intervention   162 > Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention  
 
Le tableau associatif à certes un avantage, mais lorsque les colonnes viennent à changer de nom, sa passe plus. Tu me diras, une bdd ne change pas comme sa en claquant des doigts.

Ceci dit, l'utilisation de sous-requête est quand même plus rapide à l'éxécution que de parcourir un tableau et de relancer une requête pour chaque suppression.
C'est vrai, mais j'ai donné une solution qui ME parait logique, après en travaillant en sous-requête sa fonctionne tout autant, mais pas envie de réfléchir ;)
Ou peut être parce que mon projet actuel ne me permet pas de faire de sous requetes, et que du coup sa fait longtemps que j'en ai pas fait.
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257 > freto Messages postés 1543 Date d'inscription   Statut Membre Dernière intervention  
 
Si les colonnes viennent à changer de nom, il devra de toute façon repasser dans toutes ses requêtes ;)

Ma remarque était plus informative qu'autre chose.
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
Etant donné le concept de 'mots-clés', il me parrait normal qu'un mot clé puisse être lié à plusieurs examens.

Je me permettrai donc de déconseiller de supprimer systématiquement les mots clés liés à l'examen que l'on veut supprimer.
Il vaudrait mieux supprimer uniquement les mots clés qui ne sont plus liés à aucun examen.

En utilisant les requêtes suivantes :

DELETE FROM examens WHERE numexamens = $id;
DELETE FROM avoir WHERE numexamens = $id;
DELETE FROM motscles WHERE nummc NOT IN (SELECT nummc FROM avoir);

A noter que ce principe convient également lorsque les mots clés ne sont liés qu'à un seul examen. Qui peut le plus, peut le moins.
0
Rominus Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
En faites je travail sur une application qui va avoir plus de 700 page web a gérer pour retrouver les examens donc je donne un ou plusieurs mots-clés sans m'occuper de gérer les mots-clés je n'ai pas assez de temps pour le faire car tout est a rentrer manuellement donc j'autorise les doublons

@ freto: j'ai un message d'erreur qui me di query was empty avec ta méthode j'essaierai de poster mon code se soir car je travail sur un autre ordi qui n'est pas en réseau
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
Le principe que j'explique ci dessus reste d'autant plus approprié.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Rominus Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
c'est bon j'ai réussi en mélangeant les solution que vous m'avez donné
je vous remerci d'avoir prit de votre temps pour me donner un coup de main sur mon problème
0