8791 sujets

Développement web côté serveur, CMS

Bonjour, j'ai construit un script PHP qui génère des requêtes complexes; mais PHPmyAdmin me signale des erreurs et je ne vois pas quoi. Pouvez vous m'aider ?

Voici la requête

INSERT INTO wp_bp_classifieds_categories (`parent_id`,`order`,`name`) VALUES (0,4,'New Item')
;
			UPDATE wp_bp_classifieds_categories
				SET `parent_id` = CASE id
					WHEN 17 THEN 0
 WHEN 19 THEN 17
 WHEN 21 THEN 19
 WHEN 22 THEN 19
 WHEN 20 THEN 17
 WHEN 26 THEN 20
 WHEN 23 THEN 20
 WHEN 24 THEN 20
 WHEN 18 THEN 0
 WHEN 25 THEN 18
 WHEN 27 THEN 0

				END,
				SET `order` = CASE id
					WHEN 17 THEN 1
 WHEN 19 THEN 1
 WHEN 21 THEN 1
 WHEN 22 THEN 2
 WHEN 20 THEN 2
 WHEN 26 THEN 1
 WHEN 23 THEN 2
 WHEN 24 THEN 3
 WHEN 18 THEN 2
 WHEN 25 THEN 1
 WHEN 27 THEN 3

				END,
				SET `name` = CASE id
					WHEN 17 THEN 'Fonctions de Production de films danimation'
 WHEN 19 THEN 'Réalisation'
 WHEN 21 THEN 'Réalisateur'
 WHEN 22 THEN 'Directeur artistique'
 WHEN 20 THEN 'Conception'
 WHEN 26 THEN '1er assistant décorateur spécialisé'
 WHEN 23 THEN 'Directeur de modélisation'
 WHEN 24 THEN 'Chef dessinateur danimation'
 WHEN 18 THEN 'Fonctions de la production audiovisuelle'
 WHEN 25 THEN '1er assistant décorateur'
 WHEN 27 THEN 'Fonctions de la production cinématographique'

				END
			WHERE id IN (17,19,21,22,20,26,23,24,18,25,27)


L'erreur

a écrit :
requête SQL:
MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET order = CASE id
WHEN 17 THEN 1
WHEN 19 THEN 1
WHEN 21 THEN 1
WHE' at line 16


La table si vous voulez tenter

CREATE TABLE `wp_bp_classifieds_categories` (
  `id` bigint(20) NOT NULL auto_increment,
  `parent_id` bigint(20) NOT NULL default '1',
  `order` bigint(20) default NULL,
  `name` longtext,
  PRIMARY KEY  (`id`),
  KEY `meta_key` (`order`),
  KEY `site_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=33 ;

-- 
-- Contenu de la table `wp_bp_classifieds_categories`
-- 

INSERT INTO `wp_bp_classifieds_categories` (`id`, `parent_id`, `order`, `name`) VALUES 
(17, 0, 0, 'Fonctions de Production de films d''animation'),
(18, 0, 0, 'Fonctions de la production audiovisuelle'),
(19, 17, 0, 'Réalisation'),
(20, 17, 0, 'Conception'),
(21, 19, 0, 'Réalisateur'),
(23, 20, 0, 'Directeur de modélisation'),
(24, 20, 0, 'Chef dessinateur d’animation'),
(25, 18, 0, '1er assistant décorateur'),
(26, 18, 0, '1er assistant décorateur spécialisé'),
(27, 0, 0, 'Fonctions de la production cinématographique'),
(32, 0, 4, 'New Item');


PS : avant d'entrer le champs name; je dois le formatter pour la db..
c'est bien addslashes($mavar) que je dois faire ?

merci d'avance !
Modifié par gordie (01 Jul 2009 - 21:02)
Bon, j'ai séparé mes requêtes pour y voir plus clair

la suppression, c'est ok
DELETE FROM wp_bp_classifieds_tree WHERE id IN (3) AND `type`='type'


l'insertion pose problème
INSERT INTO wp_bp_classifieds_tree (`parent_id`,`type`,`order`,`name`) VALUES (0,'type',7,'New Item') WHERE `type`='type';


a écrit :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `type`='type'' at line 1


l'update pose problème

UPDATE wp_bp_classifieds_tree 
SET `parent_id` = CASE id WHEN 4 THEN 0 WHEN 5 THEN 0 END,
SET `order` = CASE id WHEN 4 THEN 2 WHEN 5 THEN 3 END,
SET `name` = CASE id WHEN 4 THEN 'Stage' WHEN 5 THEN 'Job' END
WHERE id IN (4,5) AND `type`='type'


a écrit :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET `order` = CASE id WHEN 4 THEN 2 WHEN 5 THEN 3 END,
SET `name` = CASE id WHE' at line 3


Des idées ?
Salut,

hem... j'ai envie de te dire qu'il faut apprendre le SQL avant de s'en servir ! Smiley murf

Voir par exemple http://sqlpro.developpez.com/

Plus précisément :
a écrit :
avant d'entrer le champs name; je dois le formatter pour la db..
c'est bien addslashes($mavar) que je dois faire ?
Voir mysql_real_escape_string.

a écrit :
la suppression, c'est ok
DELETE FROM wp_bp_classifieds_tree WHERE id IN (3) AND `type`='type'
si tu n'as qu'une valeur il vaut mieux mettre where id=3 que d'utiliser le IN. D'autre part il y a de grandes chances qu'un id soit unique donc inutile de préciser AND `type`='type'

a écrit :
l'insertion pose problème
INSERT INTO wp_bp_classifieds_tree (`parent_id`,`type`,`order`,`name`) VALUES (0,'type',7,'New Item') WHERE `type`='type';
Ben oui : WHERE sert à faire une sélection alors que tu fais une INSERTION...

Pour le reste, CASE ne sert qu'avec un SELECT. Il faut donc déterminer la valeur côté PHP avant de faire l'UPDATE.
Heyoan a écrit :
Salut,

hem... j'ai envie de te dire qu'il faut apprendre le SQL avant de s'en servir ! Smiley murf


Oui je suis pas spécialiste... Smiley smile mais j'essaie Smiley smile

Heyoan a écrit :
si tu n'as qu'une valeur il vaut mieux mettre where id=3 que d'utiliser le IN. D'autre part il y a de grandes chances qu'un id soit unique donc inutile de préciser AND `type`='type'

Ah oui... là j'ai foiré, distraction Smiley smile

Heyoan a écrit :

Pour le reste, CASE ne sert qu'avec un SELECT. Il faut donc déterminer la valeur côté PHP avant de faire l'UPDATE.


C'est sûr ? J'avais lu cela ici, et il ne le mentionne pas... http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different-values-and-a-single-sql-query/
Zut alors il n'y a pas moyen de faire un UPDATE sur plusieurs champs de cette manière ?
J'aimerais éviter de faire trop de requêtes...

Merci pour ton aide !
J'ai trouvé... ça marche Smiley smile

UPDATE wp_bp_classifieds_tree 
SET (`parent_id` = CASE id WHEN 4 THEN 0 WHEN 5 THEN 0 END),
(`order` = CASE id WHEN 4 THEN 2 WHEN 5 THEN 3 END),
(`name` = CASE id WHEN 4 THEN 'Stage' WHEN 5 THEN 'Job' END)
WHERE id IN (4,5) AND `type`='type'
gordie a écrit :
C'est sûr ? J'avais lu cela ici, et il ne le mentionne pas... http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different-values-and-a-single-sql-query/
Ah ben j'avais jamais vu ça ! Smiley rolleyes

Quoi qu'il en soit je pense que c'est plus gourmand que de faire ça en PHP : détermination de la valeur à affecter et éventuellement dans une boucle... D'ailleurs je ne vois pas bien comment tu va construire ta requête de façon dynamique ! Dans ce cas tu sais qu'il s'agit des id 4 et 5 et quelles valeurs affecter mais comment vas-tu constituer une pareille requête à chaque fois ?