Problème requête DELETE

omlaly - 13 mars 2013 à 10:49
 omlaly - 22 mars 2013 à 08:21
Bonjour,

J'ai un problème avec une requête SQL DELETE. En effet, je voudrais faire une requête SQL pour pouvoir supprimer un article et ses commentaires éventuels.
J'ai fait une requête SQL DELETE avec une jointure entre les deux tables
Voici les CREATE TABLE des deux tables :
Articles
CREATE TABLE IF NOT EXISTS `articles` (
  `id_article` int(11) NOT NULL AUTO_INCREMENT,
  `nom_village` varchar(255) CHARACTER SET latin1 NOT NULL,
  `nom_categorie` varchar(255) CHARACTER SET latin1 NOT NULL,
  `date_depot` datetime NOT NULL,
  `titre_article` varchar(255) NOT NULL,
  `texte_article` text NOT NULL,
  `auteur_article` varchar(255) NOT NULL,
  PRIMARY KEY (`id_article`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=60 ;


Commentaires
CREATE TABLE IF NOT EXISTS `commentaires` (
  `id_commentaire` int(11) NOT NULL AUTO_INCREMENT,
  `user_pseudo` varchar(255) NOT NULL,
  `nom_village` varchar(255) NOT NULL,
  `nom_categorie` varchar(255) NOT NULL,
  `date_depot` datetime NOT NULL,
  `texte_commentaire` text NOT NULL,
  `id_article` int(11) NOT NULL,
  PRIMARY KEY (`id_commentaire`),
  KEY `FOREIGN KEY` (`id_article`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Voici le code PHP (la requête SQL) :
$id_article=$donnees_messages['id_article'];

// Suppression de l'article et de ses éventuels commentaires
$req_suppression_commentaires = 
"DELETE articles,commentaires FROM articles,commentaires WHERE articles.id_article=commentaires.id_commentaire AND articles.id_article=".$id_article;

$query_alerte_email_nouvel_article = mysql_query($req_suppression_commentaires) or die ('Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondants'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Vous avez supprimé cet article et ses commentaires éventuels.

";


Voici l'erreur :
Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondantsYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Si vous voyez quelque chose, n'hésitez pas...

Cordialement

100 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
13 mars 2013 à 11:22
Hello,

Je peux me tromper, mais il me semble que :
- La syntaxe d'un delete c'est "Delete From" et non "Delete champ1, champ2 From",
- Tu ne peux pas faire de requete de delete sur plusieurs tables à la fois, il faut faire une requête par table et si tu gères les transactions, les mettre dans la même transaction.


Simon
0
En effet, certains sites disent ça.

Donc, j'ai essayé en mettant ce code PHP :
$id_article=$donnees_messages['id_article'];

// Suppression de l'article et de ses éventuels commentaires
$req_suppression_articles "DELETE FROM articles WHERE id_article $id_article'";
$req_suppression_commentaires "DELETE FROM commentaires WHERE id_commentaire $id_article'";

$query_alerte_email_nouvel_article = mysql_query($req_suppression_articles)&&(mysql_query($req_suppression_commentaires)) or die ('Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondants'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Vous avez supprimé cet article et ses commentaires éventuels.

";


Quand j'essaye avec ce code, j'ai cette erreur :
Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondantsYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1


Si vous avez des idées n'hésitez pas...

Cordialement
0
J'ai vu qu'il y avait des erreurs de quotes (quotes en trop), je vous remets, donc, les deux requêtes SQL actualisées :
$req_suppression_articles "DELETE FROM articles WHERE id_article $id_article";
$req_suppression_commentaires "DELETE FROM commentaires WHERE id_commentaire $id_article";


Mais, il y a toujours cette erreur :
Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondantsYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Cordialement
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
13 mars 2013 à 14:28
Peux tu afficher le texte SQL de la requête en cas d'erreur ? (et le poster ?)

Simon
0

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

Posez votre question
Ca m'affiche ça :
Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondantsYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Cordialement
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 mars 2013 à 09:23
non, ce que je te demandais c'était d'afficher la requête elle même (telle qu'elle est envoyée au moteur de base de donnée). Est-ce que tu n'as pas un truc genre ".mysql_text()" ou ".mysql_SQL()" ?


Simon
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 mars 2013 à 09:36
Salut,

toujours incapable de faire une vraie clé étrangère à ce que je vois ...

Si tu avais une vraie clé étrangère pour commentaires.id_article tu n'aurais qu'à la déclarer ON DELETE CASCADE, et la suppression des commentaires serait faite automatiquement en même temps que la suppression de l'article, sans faire de requête SQL spécifique.

Je t'ai déjà donné les liens par le passé, débrouille toi.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 mars 2013 à 09:43
ah...
Effectivement, ça simplifierait bien les choses...


Simon
0
Salut jopop,

J'ai fait cette requête SQL (je l'ai testé sous PHPMyAdmin.) :
ALTER TABLE `commentaires` ADD FOREIGN KEY (`id_commentaire`) REFERENCES `articles`(`id_article`) ON UPDATE CASCADE ON DELETE CASCADE;


Elle me retourne cette erreur :
debug : #1452 - Cannot add or update a child row: a foreign key constraint fails (`vincentsgbdd`.<result 2 when explaining filename '#sql-64f1_3a21d6e'>, CONSTRAINT `#sql-64f1_3a21d6e_ibfk_21` FOREIGN KEY (`id_commentaire`) REFERENCES `articles` (`id_article`) ON DELETE CAS){"success":false,"error":"
#1452 - Cannot add or update a child row: a foreign key constraint fails (`vincentsgbdd`.<result 2 when explaining filename '#sql-64f1_3a21d6e'>, CONSTRAINT `#sql-64f1_3a21d6e_ibfk_21` FOREIGN KEY (`id_commentaire`) REFERENCES `articles` (`id_article`) ON DELETE CAS)<\/div>"}


Peux-tu me dire si je commence bien STP ?

Cordialement
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 mars 2013 à 20:36
Re,

le souci c'est que tu dois avoir des valeurs dans commentaires.id_articles qui n'existent pas dans articles.id_articles. Il faut trouver les commentaires où l'id_article n'existe pas et les modifier, ou supprimer ces enregistrements, voire supprimer toutes tes données (TRUNCATE TABLE).

Attention, pour du relationnel (et donc les clé étrangères) il te faut le moteur de stockage InnoDB et pas MyISAM (à voir dans les paramètres de ta base de données).
0
C'est bon, j'ai fait un TRUNCATE des deux tables et j'ai fait cette requête SQL :
ALTER TABLE `commentaires` ADD FOREIGN KEY (`id_commentaire`) REFERENCES `articles`(`id_article`) ON UPDATE CASCADE ON DELETE CASCADE;


Elle a fonctionné.

Mais en testant de supprimer un article, ça me met l'erreur suivante :
Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondantsYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Cordialement
0
Au fait, j'ai regardé le moteur de recherche et ça c'est bon.

Cordialement
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 mars 2013 à 21:05
Montre moi la requête que tu utilises, telle que générée. Il faut comprendre par là que je ne veux pas le code, je veux la requête exacte qui est passée à la fonction mysql_query (tu peux faire un echo de ta variable qui la contient pour l'afficher dans ta page, par exemple).
0
Voici le code PHP :
$id_article=$donnees_messages['id_article'];

// Suppression de l'article et de ses éventuels commentaires
$req_suppression_articles "DELETE FROM articles WHERE id_article $id_article";
$req_suppression_commentaires "DELETE FROM commentaires WHERE id_commentaire $id_article";

$query_alerte_email_nouvel_article = mysql_query($req_suppression_articles)&&(mysql_query($req_suppression_commentaires)) or die ('Erreur sur la requête SQL concernant la suppression des articles et des commentaires correspondants'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Vous avez supprimé cet article et ses commentaires éventuels.

";


En cherchant sur le net, j'ai vu qu'il n'était pas possible, avec la requête DELETE, de supprimer des enregistrements dans plusieurs tables en même temps, c'est pour cela que j'ai fait deux requêtes SQL DELETE (une pour supprimer l'article concernnée et l'autre pour supprimer les commentaires correspondants) mais sans succès...

Cordialement
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 mars 2013 à 21:26
Qu'est-ce que tu n'as pas compris dans "je ne veux pas le code" ?
Ensuite qu'as-tu compris du ON DELETE CASCADE ?
0
Maintenant quand je poste un article, ça l'enregistre deux fois dans la base de données !

Est-ce que la requête ALTER TABLE peut avoir une coincidence sur ça ? Avant, ça l'enregistré qu'une fois !

Cordialement
0
C'est pour faire une suppression en cascade.

Cordialement
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 mars 2013 à 21:41
Non, dans ton cas particulier (le ALTER TABLE que tu as retranscrit plus haut), comme dans l'absolu, un ALTER TABLE n'engendre pas un double enregistrement. Le problème vient soit de ton code, soit d'une mauvaise manip'.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 mars 2013 à 21:42
Quel est le principe de la suppression en cascade ?
0
Quand tu supprimes quelque chose, tu supprimes des autres données automatiquement.

Cordialement
0
Rejoignez-nous