Salut tout le monde je rencontre un petit problème depuis hier en fait je suis entrain de crée un espace membre avec système de news en php MySQL que les membres inscrit peuvent commenter le sujet qui leur intéresse mais je me suis rendue compte que si un membre se désinscrit et bien je gardais tous ses commentaires.

Voici mon ancienne requête :

$delete_account = $bdd->prepare('
    DELETE FROM user WHERE id = :id
    ');
$delete_account->execute(array('id' => $_SESSION['id']));
$delete_account->closeCursor();

et en suite j'ai fait des recherche sur internet pour faire une JOINTURE avec un DELETE mais sans sucés cela ne fonctionne pas !

voici la requête avec un INNER JOIN :

$delete_account =$bdd->prepare('
    DELETE * FROM user
    INNER JOIN user.id = commentaires.id_user
    WHERE id = :id
    ');
$delete_account->execute(array('id' => $_SESSION['id']));
$delete_account->closeCursor();

et sa ne m'affiche aucune erreur dans mon script php mais dans l'ongle SQL de phpMyAdmin sa m'affiche :

1064 - Erreur de syntaxe près de 'INNER JOIN user.id = commentaires.id_user WHERE id = 3' à la ligne 2

et je bloque sur ça depuis hier !

Je peux également faire une autre requête pour supprimer rien que les commentaires, comme cela que j'ai fait et qu'elle fonctionne :

$delete_account =$bdd->prepare('
    DELETE FROM `commentaires`
    WHERE id = :id
    ');
$delete_account->execute(array('id' => $_SESSION['id']));
$delete_account->closeCursor();

Je sais qu'on peux faire une jointure entre deux table ensuite supprimer les tous les entrée mais je n'arrive vraiment pas à le faire !!!

Si quelqu'un saurais comment m'aider se serais vraiment très génial !

11 réponses


Rachid1080
Auteur
Réponse acceptée

Merci les gars pour votre entraide mais avec quelque recherche j'ai pue résoudre ce probléme !
Juste avec cette petite requéte ...

$delete_account = $bdd->prepare('
              DELETE user, commentaires
              FROM user
              INNER JOIN commentaires
              ON user.id = commentaires.id_user
              WHERE user.id = :id
              ')
$delete_account->execute(array('id' => $_SESSION['id']));
$delete_account->closeCursor();

Merçi tous le monde

Salut,

Attention,
quand tu fais tes 2 requêtes séparées, pour 'delete' les commentaires, tu 'delete' selon l'id du commentaire.
Il faudrait le faire selon l'id de l'utilisateur non ?
du style remplacer ce genre là :

DELETE FROM `commentaires`
    WHERE id = :id

par ce genre là ?

DELETE FROM `commentaires`
    WHERE user_id = :id

la table 'commentaires' aurait donc un champ 'id' en auto_incremente,
et un champ 'user_id' pour savoir a qui appartient ce commentaire.

2ème attention ^^
Tu es sur de vouloir supprimer les commentaires déjà postés des membres qui se désinscrivent ?
J'ai l'impression qu'il faut seulement empêcher aux "non inscrits" de poster un commentaire.
Mais si tu effaces les commentaires déjà postés, les anciennes conversations seront "à trous", et seront vraiment bizarre à lire.

Peut-être au cas où,
on pourrait ne pas afficher ces commentaires,
plutôt que de les supprimer.

Sinon,
s'il faut vraiment supprimer les anciens commentaires :

Moi je n'ai jamais utilisé de delete avec inner join (en plus je suis nul en SQL)
du coup j'essaie d'apprendre aussi, et j'attends les réponses des autres.

Mais en attendant,
est-ce que ceci fonctionne ?

$delete_account = $bdd->prepare('
    DELETE FROM commentaires c
    INNER JOIN user u
    WHERE c.user_id = :id
        AND u.id = :id
');
$delete_account->execute(array('id' => $_SESSION['id']));

Pourquoi ne pas rajouter une "contrainte" directement dans MySQL qui permettrais de supprimer automatiquement tous les commentaires d'un utilisateur par MySQL lors de la suppression d'un utilisateur ?

Tu passes cette requete sur ta BDD (dans PhpMyAdmin ou directement sur ta console) :

ALTER TABLE commentaires ADD  CONSTRAINT `comment_user` FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE

Et lorsque tu passeras ta requete

$delete_account = $bdd->prepare('
    DELETE FROM user WHERE id = :id
    ');
$delete_account->execute(array('id' => $_SESSION['id']));
$delete_account->closeCursor();

Les commentaires liés à cet user_id seront supprimés automatiquement.

Je rejoins @Axis, le ON DELETE CASCADE est fait pour ça
Sinon MySQL propose le Multi-delete qui permet de supprimer dans plusieurs tables à la fois.
ça n'existe pas dans les autres SGBD

DELETE t1, t2 FROM t1  INNER JOIN t2 
WHERE t1.id=t2.id AND t1.id = :user_id;

Je rejoins @Axis, le ON DELETE CASCADE est fait pour ça

Ah bon ?
Mince alors, moi j'aurai cru que c'était une mauvaise idée de séparer la logique en 2 parties si éloignées.
Et que c'était encore préférable de faire 2 requêtes séparées au même endroit, comme Lee faisait au début.

Ou alors mettre un commentaire dans le code PHP pour prévenir qu'on a chargé le SGBD de supprimer les commentaires ?

SLK, j'ai essayé ta requéte mais elle m'envoie une erreur et tqk moi aussi je suis un en BDD mais en fait si tu veux j'avais champs id et il était les deux anbigu c'est pour ça parce MySQL savais pas quoi faire supprimer selon id de l'user ou du commentaires mais là je lui est bien préciser avec

WHERE user.id = :id

mais sinon t'as raison il faut pas que je supprime les commentaires des user désinscrit mais sa sert a rien que je les garde aussi, non?

Axis,Huggy je ne me connais pas beaucoup en bdd je crois que je vais laisser sa comsa pour pas avoir de mauvaise surprise par aprés, mais comme même merci les gars !

t'as raison il faut pas que je supprime les commentaires des user désinscrit

mais sa sert a rien que je les garde aussi, non?

Ben heu... hein ?
Attends ^^
S'il FAUT ne PAS suprimer les commentaires, alors ça SERT de les garder.

S'il faut ne pas les supprimer pour éviter d'avoir des conversations à trous,
alors c'est utile de les garder pour pouvoir les afficher (pour ne pas avoir de conversations à trous).

Peut-être que je n'ai pas compris ce que tu voulais dire...

moi aussi je suis un en BDD mais en fait si tu veux j'avais champs id et il était les deux anbigu c'est pour ça parce MySQL savais pas quoi faire supprimer selon id de l'user ou du commentaires

Là non plus, je ne pige pas grand chose... xD

SLK, j'ai bien compris qu'il faut pas que je supprime les commentaires des utilisateurs qui se sont désinscrit mais dans ma page commentaire.php j'affichais les commentaire ainsi que les pseudo ! Et donc je vais afficher rien que le commentaires sa serais moin bon à voir non ?
et je voulais te dire en fait que je me connais pas trop en BDD moi aussi ! Mais le probléme c'est que dans les deux tables (user et commentaires) il y avait dans chaque table un champ 'id' et je croit que c'est pour sa qu'il voulais pas me DELETE les commentaires parce que MySQL savais pas trop de quel id ' je voulais DELETE '

Et donc je vais afficher rien que le commentaires sa serais moin bon à voir non ?

Ah oui je vois.
Alors peut-être que tu peux rajouter un champ 'account_activated' dans ta table 'user'. (qui serait à 1 normalement)
Comme ça, quand un utilisateur se désinscrit, tu update ce champ à 0. (au lieu de carrément supprimer le user).
Comme ça tu pourra continuer d'afficher leur nom et commentaires.

Mais si on fait ça, il faut repenser un peu le reste du site.
Par exemple quand un utilisateur essaie de se connecter, il faudrait changer un peu la requête SQL pour demander de vérifier si le couple login/password est bon, mais seulement pour les 'user' ayant le champ 'account_activated' à 1.
Peut-être qu'il n'y aura pas que ça à changer, ça dépend de tout ce que tu as fais pour ton site.

Mais le probléme c'est que dans les deux tables (user et commentaires) il y avait dans chaque table un champ 'id' et je croit que c'est pour sa qu'il voulais pas me DELETE les commentaires parce que MySQL savais pas trop de quel id ' je voulais DELETE '

Non c'est normal d'avoir un champ 'id' dans chaque table, il n'y a pas de conflits.
Quand tu faisais

DELETE FROM `commentaires`
    WHERE id = :id

Le SGBD savait très bien que tu parlais du 'id' de la table 'commentaires' et pas d'une autre.
Le vrai problème c'est qu'on ne savait pas écrire la bonne requête ^^
En tous cas c'est bon, c'est résolu.

Je crois que je vais laisser sa comme ça pour l'instant parce que si garde tous les coordonées des membres même quand ils se sonts désinscrit, ma bdd sera pleine avec des données qui sont pas vraiment utiles !

Mais en tous cas le sujet est résolu, merci beaucoup à toi de m'avoir donner tes conseil !