[RESOLU] ON DUPLICATE KEY UPDATE

Mammouth du PHP | 504 Messages

29 janv. 2014, 13:31

Bonjour a tous,

J'ai une requete mysql comme ceci;
@mysql_query("INSERT INTO `cache_departement` (`id`,`ref_dep`,`ref_type`,`name_thing`,`city_thing`,`image_thing`,`url_thing`,`libelle_thing`,`price_thing`
) VALUES (NULL,
'".mysql_real_escape_string($_GET['depid'])."',     
'R0',
'".mysql_real_escape_string($content['decouvertes'][0]['titre_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['city'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['photo_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['url_actu'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['libelle'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['Prix'])."'
) ON DUPLICATE KEY UPDATE `ref_type`='R0' ") or die("Erreur MySQL : ".mysql_error());
L'enregistrement si il n'existe pas est bien crée mais la mise à jour des enregistrements présents ne se fait pas ?
(ref_type est bien en index unique).

Merci de votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 janv. 2014, 15:32

salut,

as tu testé la requête sql dans un client mysql ?

c'est quoi les clefs de ta table ?

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 504 Messages

29 janv. 2014, 15:59

les clefs sont id en Primary, auto_increment, unique
et ref_type en unique

Je ne vois pas pourquoi seul l'ajout fonctionne et pas la mise a jours. J'ai tester meme probleme dans le phpmyadmin.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 janv. 2014, 23:35

ben tu force l'id à null donc déjà il ne peux pas forcer un update
de plus tu force la colonne ref_type = RO or si la colonne à une clef unique cela ne peux pas fonctionner plus d'une fois.

donc je pense que
ref_type n'a pas de clef unique
que seul l'id pourrait faire déclencher un update mais ce ne sera jamais le cas vu qu'il est forcé à null (et que donc on utilise le mécanisme d'auto incrément).

il faut revoir la chose quelque part car le ce que tu indique me semble cohérent.

peux tu fournir le ddl de la table (create table)?

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 504 Messages

30 janv. 2014, 12:41

Voici le create table:

[mysql]CREATE TABLE `cache_departement` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(50) NOT NULL,
`ref_dep` varchar(4) NOT NULL DEFAULT '',
`ref_type` varchar(30) NOT NULL DEFAULT '',
`name_thing` varchar(255) NOT NULL DEFAULT '',
`city_thing` varchar(255) NOT NULL DEFAULT '',
`image_thing` varchar(255) NOT NULL DEFAULT '',
`url_thing` varchar(255) NOT NULL DEFAULT '',
`libelle_thing` varchar(255) NOT NULL DEFAULT '',
`price_thing` varchar(255) NOT NULL DEFAULT '',
`name_event` varchar(255) NOT NULL,
`manufacturer` varchar(255) NOT NULL DEFAULT '',
`start_event` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`end_event` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`extra2` varchar(255) NOT NULL DEFAULT '',
`url_event_sale` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `ref_type` (`ref_type`),
KEY `type` (`type`),
KEY `ref_dep` (`ref_dep`)
) ENGINE=MyISAM AUTO_INCREMENT=3401 DEFAULT CHARSET=utf8;[/mysql]

Je ne comprend toujours pas.
Modifié en dernier par moogli le 30 janv. 2014, 12:56, modifié 1 fois.
Raison : bbcode mysql

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 janv. 2014, 15:51

ref_type étant unique tu ne peux avoir qu'une seule ligne dans la table avec ref_type=RO

or systématiquement tu veux insérer cette valeur.
ou alors la forcer à zéro !

je pense que tu ne comprend pas ce que fait cette requête et que tu te mélange un peu les pinceaux avec ce que tu veux au final.

si tu nous explique ce que tu tente de faire peux être que l'on pourrat t'aider.
La j'ai l'impression qu'il y a un problème de conception du modèle (vu l'utilisation que tu compte en faire).

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 504 Messages

30 janv. 2014, 16:51

En fait cette requete me sert pour sauvegarder les données quotidiennement issus d'une tache cron:
@mysql_query("INSERT INTO `cache_departement` (`id`,`ref_dep`,`ref_type`,`name_thing`,`city_thing`,`image_thing`,`url_thing`,`libelle_thing`,`price_thing`
) VALUES (NULL,
'".mysql_real_escape_string($_GET['depid'])."',     
'R0',
'".mysql_real_escape_string($content['decouvertes'][0]['titre_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['city'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['photo_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['url_actu'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['libelle'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['Prix'])."'
) ON DUPLICATE KEY UPDATE `ref_type`='R0' ") OR die("Erreur MySQL : ".mysql_error());
J'effectue ma requete sql tous les jours à 01:00 am, ce qui me permet d'avoir une sorte de créer un cache de donnée issu de mysql qui change tous les jours. cela rend le site plus rapide que de chercher les éléments actifs à chaque demande entre 2 dates.

En ce sens, je souhaite faire un ON DUPLICATE KEY UPDATE plutot qu'un update.

donc la mise a jour se fait sur une clef unique que j'ai appeler ref_type. si la clef existe, la mise a jour doit se faire si elle n'existe pas, je la creer d'ou ref_type=RO.

J'espere avoir été clair. Merci.