Empecher un double INSERT

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Empecher un double INSERT

par Sékiltoyai » 14 oct. 2007, 19:54

Clé "UNIQUE", c'est bien ça ;)
Merci, j'avais loupé le UNIQUE dans la doc mysql, je me suis rabattu sur le moins illogique :D (pourtant j'étais bien persuadué que c'était UNIQUE avant de lire la doc :) )

par Hubert Roksor » 14 oct. 2007, 16:29

Clé "UNIQUE", c'est bien ça ;)

par Sékiltoyai » 14 oct. 2007, 15:15

Je suppose que tu peux donc mettre une clé unique (clé UNIQUE dans MySQL si je ne me trompe) sur titre et nom. De cette manière, si un enregistrement avec le même nom ou le même titre venait à être inséré, il y aurait une erreur de duplication de clé empéchant de faire un doublon (et c'est à ça que ca sert…)

par supercanard » 13 oct. 2007, 18:54

Vu que pour l'instant j'en ai que deux, j'ai pas trop de problèmes, voilà mes tables :
// CREATION TABLE PAGES
$req= mysql_query("CREATE TABLE if not exists bloom_pages (
`id` int(11) NOT NULL auto_increment,
  `nom` varchar (25) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `contenu` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `nom_lien` varchar (25) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `pos_lien` int(11) NOT NULL,
  `visible` int(1) NOT NULL,
  PRIMARY KEY  (`id`)
)ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci");

$req= mysql_query("INSERT INTO bloom_pages (id,nom,contenu,nom_lien,pos_lien,visible) VALUES ('','index','<h1>Bienvenue sur votre BloOm CMS !</h1><p>Ceci est votre page d\'accueil. Connectez-vous pour administrer BloOm CMS !.</p>','Accueil','0','1')");

// CREATION TABLE CONFIG
$req= mysql_query("CREATE TABLE if not exists bloom_config (
`id` int(1) NOT NULL,
  `titre` varchar (50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `description` varchar (250) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `motscles` varchar (250) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `css` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`)
)ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci");

$req= mysql_query("INSERT INTO bloom_config (id,titre,description,motscles,css) VALUES ('1', 'BloOm CMS !', 'Le petit CMS simple et léger !', 'bloom,cms,xhtml,css,php', '/* Votre code CSS */')");

par Sékiltoyai » 13 oct. 2007, 18:30

Tu n'as pas des clés UNIQUE ou PRIMARY dans tes tables ? Tu as quelles genres de shémas de table ?

par supercanard » 13 oct. 2007, 18:05

C'est étrange comme façon de faire.. pourquoi tu exécuterais deux fois le script ?

Fait un DROP sinon, comme ça tu effaces la table, tout simplement , ou utilises un update au lieu d'un insert..
Je t'explique. Sans même parler de l'executter 2 fois, le CMS que je distribue sera mis à jour.
Il faut donc que ceux qui ont déjà une version puissent installer la mise à jour sans toucher aux tables qui ne sont pas à modifier, quand à ceux qui l'installent pour la première fois le problème ne se pose pas.
De ce fait l'update et le drop ne peuvent pas fonctionner. Puisque il ne faut pas que les utilisateurs perdent leur tables...

par Tracker » 13 oct. 2007, 17:41

Peut-être une procédure stockée ?

par Berzemus » 13 oct. 2007, 17:36

C'est étrange comme façon de faire.. pourquoi tu exécuterais deux fois le script ?

Fait un DROP sinon, comme ça tu effaces la table, tout simplement , ou utilises un update au lieu d'un insert..

Empecher un double INSERT

par supercanard » 13 oct. 2007, 16:50

Bonjour,
Voilà mon soucis. J'ai fait un script qui crée automatiquement des tables et insert des données par défaut.

Exemple dans ma première requête je crée donc la table toto, si elle n'existe pas : CREATE TABLE toto IF NOT EXIST

Dans la seconde j'insère les données de départ.

Maintenant, si l'on exécute le script une deuxième fois la première requête n'est pas exécuté car la table existe mais la deuxième si... ce qui donne un champ en double.

J'ai bien une solution mais je ne sais pas si c'est possible : il faudrais que le CREATE et L'INSERT soit dans la même requête. Puisque la table existe, elle ne serrais pas créée et il n'y aurait pas d'insert...

Ou une autre, puisque tout ça est exécuté via PHP, je pourrais faire une condition : Si la table est créée, exécute la deuxième requête, sinon rien.

Quelqun aurait une piste ?