OVH Cloud OVH Cloud

Question de debutant sur formulaire

40 réponses
Avatar
Marc Mendez
Bonjour,

J'ai un formulaire en HTML , tout simple, qui permet par exemple d'ajouter
un élément dans un base de données.
Je passe par un post qui appelle la même page. Le choix du traitement est
conditionné par un paramètre qui indique ce que je veux faire (add, del,
update).
Tout marche très bien. Sauf que si je fais un refresh dans le navigateur de
la page, suite à une action, il me rebalance le même traitement !
Il faudrait en fait, une fois que mon traitement est effectué, que j'efface
le contenu des paramètres..... commen faire ? ou y-a-t-il un autre moyen ?

J'espère avoir été assez clair....

merci de votre aide.

10 réponses

1 2 3 4
Avatar
Patrick Mevzek
Il doit toujours y avoir une clé primaire dans une table d'une base de
données de SGBD relationnel.


Non, aucune obligation à cela.

Dans l'exemple que vous donnez il manque la date de la transaction et
l'ensemble {emetteur, destinataire, date } forme la clé de la table.


Vu qu'une clef primaire doit avoir la propriété d'unicité et que rien
n'empêche quelqu'un de faire deux virements le même jour à la même
destination, votre n-uplet ne peut être une clef.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>

Avatar
Michel Billaud
Larroque writes:

Michel Billaud disait ceci en ce jour du 18.09.2006 16:29:

Si c'est de l'INSERT, il suffit de choisir correctement ses clefs
uniques/primaires.
Quand y en a, et y en a pas toujours.

Contre-exemple, un site genre banque pour rire où il y a des
"virements" à faire d'un compte à un autre. On n'attribue pas un
identifiant a priori à chaque virement, donc si on reposte l'ordre de
virement (emetteur, destinataire, montant), c'est pas la vérification
SQL qui y peut quelque chose... Même remarque pour l'UPDATE.
La solution est alors le jeton pour évite de re-traiter un
formulaire.



Il doit toujours y avoir une clé primaire dans une table d'une base de
données de SGBD relationnel.


Au sens de la théorie relationnelle, où une table est un ensemble de
t-uples, en effet. Il devrait donc y en avoir. Ca serait bien. Mais
laquelle ?

Dans l'exemple que vous donnez il manque la date de la transaction et
l'ensemble {emetteur, destinataire, date } forme la clé de la table.


Si vous prenez comme "date de transaction" la date+heure où
l'insertion a lieu, le renvoi du même contenu de formulaire un peu
plus tard correspond à deux insertions faites à des dates+heures
différentes.

Ou alors, si date = journée, vous interdisez à un émetteur de faire
deux transactions avec le même destinataire la même journée ? :-)

Autre hypothèse, vous prenez comme "date de transaction" la date
(unique) à la microseconde de la fabrication du formulaire. Et là,
vous êtes en train de réinventer le jeton.

MB

--
Michel BILLAUD
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)



Avatar
Larroque
Michel Billaud disait ceci en ce jour du 30.09.2006 22:04:

Autre hypothèse, vous prenez comme "date de transaction" la date
(unique) à la microseconde de la fabrication du formulaire. Et là,
vous êtes en train de réinventer le jeton.



Je ne ré-invente rien du tout, il suffit de lire n'importe quel ouvrage
sur Merise ou sur les SGD relationnels.

La date ( à la micro-seconde, seconde, ...., année ) est un objet qui
modélise le monde réel et non un jeton qui est, si j'ai bien compris,
une astuce technique.

J'ajoute que j'ai pris l'exemple de la date, mais ce pourrait être un
numéro de transaction bancaire ( qui n'a rien à voir avec un numéro
d'ordre dans la base de données ) si l'analyse a montré que c'est comme
ça que ça fonctionne dans la réalité.

De toute façon, vous ne pouvez créer de table qui n'ait pas de clé,
sinon votre analyse est mauvaise et M. Codd ne sera pas d'accord.

--
---- Pierre ----
L'homme est sorti de la femme à sa naissance et passe sa vie à vouloir y
re-entrer.
Anonyme

Avatar
Larroque
Patrick Mevzek disait ceci en ce jour du 30.09.2006 22:04:
Il doit toujours y avoir une clé primaire dans une table d'une base de
données de SGBD relationnel.


Non, aucune obligation à cela.



Si, il y a. Voir les ouvrages de M. Gardarin, par ex, je cite:
"Par définition, une relation est un ensemble de tuples. Un ensemble
n'ayant pas d'élément en double, il ne peut exister 2 fois le même tuple
dans une relation. Afin d'identifier les tuples d'une relation sans
donner toutes les valeurs et d'assurer simplement l'unicité des tuples,
la notion de clé est utilisé.

Clé ( Key ): Ensemble d'attributs minimal dont la connaissance des
valeurs permet d'identifier un tuple unique de la relation considérée.
"

On parle d'attribut de la relation et un numéro d'ordre interne à la
base de données n'est pas un attribut mais une astuce technique qui peut
permettre des simplifications mais en aucun cas remplacer la clé ( d'où
la recommandation de M. Gallet d'utiliser le UNIQUE(....) si vous
choisissez comme clé un nombre auto-incrémenté interne, qui en fait, est
une fausse clé ).

Dans l'exemple que vous donnez il manque la date de la transaction et
l'ensemble {emetteur, destinataire, date } forme la clé de la table.


Vu qu'une clef primaire doit avoir la propriété d'unicité et que rien
n'empêche quelqu'un de faire deux virements le même jour à la même
destination, votre n-uplet ne peut être une clef.



Date est à prendre au sens large en tant qu'objet et peut être exprimée
en nano-seconde si ça vous fait plaisir.

De toute façon, créer une table {emetteur, destinataire, montant} veut
dire que vous n'autoriser qu'une transaction d'un montant x entre
l'émetteur toto et le destinataire titi et ce, pour toute la durée
d'existence de la base de données relationnelle.

Je ne pense pas que ce soit ce que l'on veut.

--
---- Pierre ----
Les lois inutiles affaiblissent les lois nécessaires.
Montesquieu


Avatar
Larroque
Même remarque que pour ma réponse à M. Billaud

Patrick Mevzek disait ceci en ce jour du 30.09.2006 22:04:
Il doit toujours y avoir une clé primaire dans une table d'une base de
données de SGBD relationnel.


Non, aucune obligation à cela.



Si, obligation il y a.

N'importe quel ouvrage sur les bases de données relationnelles ( comme
ceux de M. Gardarin ) vous le confirmera.

Dans l'exemple que vous donnez il manque la date de la transaction et
l'ensemble {emetteur, destinataire, date } forme la clé de la table.


Vu qu'une clef primaire doit avoir la propriété d'unicité et que rien
n'empêche quelqu'un de faire deux virements le même jour à la même
destination, votre n-uplet ne peut être une clef.



Date est un objet que vous pouvez définir à la nano-seconde si ça vous
chante et si votre système de traitement le permet.

Voir la réponse à M. Billaud pour d'autres solutions.

De toute façon, si vous créez des tables sans clé, c'est qu'il y a eu
erreur d'analyse ( je parle au niveau de l'analyse, pas de
l'implémentation ).

En ce qui concerne l'implémentation, M. Gallet, dans sa documentation,
donne la réponse:
- l'auto-incrément, même défini en tant que clé primaire dans la base de
données, n'est en aucun cas ( à moins que ce champ ne corresponde à la
modélisation d'un objet du monde réel ) la vrai clé;
- d'où la nécessité, dans ce cas, de définir la vrai clé primaire en
indiquant la clause UNIQUE(.....) et d'utiliser, dans le cas de Mysql,
le moteur InnoDb.


--
---- Pierre ----
Il est bon qu'une nation soit assez forte de tradition et d'honneur pour
trouver le courage de dénoncer ses propres erreurs. Mais elle ne doit
pas oublier les raisons qu'elle peut avoir encore de s'estimer elle-même.
Albert Camus


Avatar
Larroque
Tout d'abord, j'avais déjà envoyé une réponse; ne la voyant pas sur le
forum, je re-réponds. Veuillez m'excuser si les 2 réponses arrivent et
doublonnent.

Michel Billaud disait ceci en ce jour du 30.09.2006 22:04:
Larroque writes:


Il doit toujours y avoir une clé primaire dans une table d'une base de

données de SGBD relationnel.


Au sens de la théorie relationnelle, où une table est un ensemble de
t-uples, en effet. Il devrait donc y en avoir. Ca serait bien. Mais
laquelle ?



C'est à l'analyse de vous le dire: ce peut-être la date, un numéro de
bordereau, ou un numéro de bordereau avec la date du jour ou le numéro
de guichet avec un numéro d'ordre dans la journée.....

De toute façon, dans les règles de gestion, il y a forcement une clé
pour faire la différence entre les transactions qui doivent être uniques.

Si vous prenez comme "date de transaction" la date+heure où
l'insertion a lieu, le renvoi du même contenu de formulaire un peu
plus tard correspond à deux insertions faites à des dates+heures
différentes.

Ou alors, si date = journée, vous interdisez à un émetteur de faire
deux transactions avec le même destinataire la même journée ? :-)

Autre hypothèse, vous prenez comme "date de transaction" la date
(unique) à la microseconde de la fabrication du formulaire. Et là,
vous êtes en train de réinventer le jeton.


La date, dans ce cas, est un objet modélisant le monde réel et non une
astuce informatique pour améliorer et faciliter le traitement ( si j'ai
bien compris, ce qu'est un jeton ).

Dans votre analyse, vous définissez un virement comme ceci:
(emetteur, destinataire, montant)
ce qui veut dire, dans le meilleur des cas, que vous n'autorisez, qu'une
et une seule transaction d'un montant x entre l'émetteur toto et le
destinataire titi.

Je ne pense pas que c'est ce que vous voulez, amha.

Dans tous les cas, l'analyse du monde réel doit vous amener à définir
des relations qui possèdent des clés.
Qu'ensuite, vous automatisiez cette gestion avec des orgues de barbarie,
des employés de banque ou des ordinateurs, peu importe.
Et que vous utilisiez des astuces comme l'auto-incrément pour vous
faciliter la tache n'a rien à voir avec l'existence d'une clé dans
chaque table.

--
---- Pierre ----
On a toujours tort d'essayer d'avoir raison devant des gens qui ont
toutes les bonnes raisons de croire qu'ils n'ont pas tort.
Raymond Devos



Avatar
Patrick Mevzek
Si, obligation il y a.

N'importe quel ouvrage sur les bases de données relationnelles ( comme
ceux de M. Gardarin ) vous le confirmera.


Aucune obligation à avoir les données normalisées.

Date est un objet que vous pouvez définir à la nano-seconde si ça vous
chante et si votre système de traitement le permet.


Ca ne fait que diminuer la probabilité de collision, pas l'annuler.

De toute façon, si vous créez des tables sans clé, c'est qu'il y a eu
erreur d'analyse


Non.
Une table n'a pas nécessairement de clef primaire. Ce n'est pas utile
dans tous les cas.
Je vous donne un seul exemple : une table utilisé en append only (que des
insertions, aucune modification), par exemple le stockage de logs d'une
application quelconque. Il n'y a besoin d'aucune clef sur cette table.

En ce qui concerne l'implémentation, M. Gallet, dans sa documentation,
donne la réponse:
- l'auto-incrément, même défini en tant que clé primaire dans la base de
données, n'est en aucun cas ( à moins que ce champ ne corresponde à la
modélisation d'un objet du monde réel ) la vrai clé;


On parle de clef technique vs une clef naturelle. Vraie clef et fausse
clef cela ne veut rien dire.
Par définition le Mysql-ism auto_increment ne peut qu'être une clef
technique.

- d'où la nécessité, dans ce cas, de définir la vrai clé primaire en
indiquant la clause UNIQUE(.....) et d'utiliser, dans le cas de Mysql,
le moteur InnoDb.


Vous êtes au courant qu'il existe
1) autre chose que MySQL dans la vraie vie
2) des objets normalisés pour ce besoin, qu'on appelle les séquences ?

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>

Avatar
Patrick Mevzek
Si, il y a. Voir les ouvrages de M. Gardarin, par ex, je cite:
"Par définition, une relation est un ensemble de tuples. Un ensemble
n'ayant pas d'élément en double, il ne peut exister 2 fois le même tuple
dans une relation. Afin d'identifier les tuples d'une relation sans


Il n'y a pas nécessairement toujours besoin d'identifier.

donner toutes les valeurs et d'assurer simplement l'unicité des tuples,
la notion de clé est utilisé.


Unicité et clef sont deux considérations orthogonales. On peut très
bien avoir un attribut avec la contrainte d'unicité, donc permettant
d'identifier les tuples en double, sans que cela soit une clef.

Une clef, notamment naturelle, a une considération sémantique derrière.
Une contrainte d'unicité c'est uniquement une contrainte technique.

Clé ( Key ): Ensemble d'attributs minimal dont la connaissance des
valeurs permet d'identifier un tuple unique de la relation considérée.
"


Certes, mais cela n'indique pas que cet objet doit nécessairement exister.

Je pense que vous mélangez obligations et possibilités et, qu'enfermé
dans un modèle, vous ne voyez pas la nécessité de s'adapter aux cas de
figure.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>

Avatar
Larroque
Patrick Mevzek disait ceci en ce jour du 01.10.2006 23:18:

Aucune obligation à avoir les données normalisées.



Bien sur qu'il n'y a aucune obligation à suivre des règles; mais s'il y
a des gens qui les ont établies, ce n'est pas pour rien.

Maintenant, vous en faites ce que vous voulez.

Date est un objet que vous pouvez définir à la nano-seconde si ça vous
chante et si votre système de traitement le permet.


Ca ne fait que diminuer la probabilité de collision, pas l'annuler.



Ça ne fait que répondre à une analyse dans lequel on dit qu'on accepte
qu'une transaction entre toto et titi par ms, ns ou s ou siècle.

On est au stade de la conceptualisation pas de l'implémentation; alors ,
les collisions.....

De toute façon, si vous créez des tables sans clé, c'est qu'il y a eu
erreur d'analyse


Non.
Une table n'a pas nécessairement de clef primaire. Ce n'est pas utile
dans tous les cas.
Je vous donne un seul exemple : une table utilisé en append only (que des
insertions, aucune modification), par exemple le stockage de logs d'une
application quelconque. Il n'y a besoin d'aucune clef sur cette table.



Ah bon ? Et vous faites comment pour retrouver un enregistrement ? Sur
quel(s) critère(s) ?

Si vous n'avez pas de clé, impossible ( c'est d'ailleurs en partie pour
ça que sont nés les SGBD relationnels )..

Alors, à quoi sert votre stockage ?

D'ailleurs, il est évident que les logs sont stockés n'importe comment (
enfin, chez moi, il y a quand même la date, l'application qui a créée
l'enregistrement, quoi, des trucs qui, réunis, ressemblent furieusement
à une clé ).

En ce qui concerne l'implémentation, M. Gallet, dans sa documentation,
donne la réponse:
- l'auto-incrément, même défini en tant que clé primaire dans la base de
données, n'est en aucun cas ( à moins que ce champ ne corresponde à la
modélisation d'un objet du monde réel ) la vrai clé;


On parle de clef technique vs une clef naturelle. Vraie clef et fausse
clef cela ne veut rien dire.
Par définition le Mysql-ism auto_increment ne peut qu'être une clef
technique.



Je parle de clé au niveau de la conception. Les clés techniques
n'existent pas, amha ( jamais entendu parlé ).

Maintenant, si vous souhaitez ou si certains auteurs souhaitent les
appeler comme ça, pourquoi pas.

Mais ça ne résout pas le problème de l'existence nécessaire d'une vrai
clé, dont j'ai recopié la définition par M. Gardarin ( aimable
plaisantin, s'il en est ).

- d'où la nécessité, dans ce cas, de définir la vrai clé primaire en
indiquant la clause UNIQUE(.....) et d'utiliser, dans le cas de Mysql,
le moteur InnoDb.


Vous êtes au courant qu'il existe
1) autre chose que MySQL dans la vraie vie
2) des objets normalisés pour ce besoin, qu'on appelle les séquences ?



Je crois que le thread parlait du problème avec Mysql, non ?

Sinon, j'ai travaillé avec Oracle et Postgresql qui ont des séquences
lesquelles ne sont pas plus des clés que les auto-incrément de Mysql.

Vous êtes au courant qu'il existe des théories sur l'algèbre
relationnelle, les bases de données relationnelles ?

Si non, vous devriez lire des ouvrages sur le sujet;
si oui, vous ferez bien de les relire.

--
---- Pierre ----
Les lois inutiles affaiblissent les lois nécessaires.
Montesquieu


Avatar
Patrick Mevzek
Aucune obligation à avoir les données normalisées.


Bien sur qu'il n'y a aucune obligation à suivre des règles; mais s'il y
a des gens qui les ont établies, ce n'est pas pour rien.


Pour les appliquer, mieux vaut les comprendre d'abord !

Si vous n'avez pas de clé, impossible ( c'est d'ailleurs en partie pour
ça que sont nés les SGBD relationnels )..


Bien sûr que si. Bon j'arrête la la discussion avec vous, en plus
d'être HS, elle ne sert à rien. Répondez si vous voulez je vous
laisserai le dernier mot, si vous y tenez.

Je parle de clé au niveau de la conception. Les clés techniques
n'existent pas, amha ( jamais entendu parlé ).


Il vous en reste du travail alors... soyez moins sûr de vous, plus
humble, et revenez quand vous connaîtrez davantage du sujet, merci.

Maintenant, si vous souhaitez ou si certains auteurs souhaitent les
appeler comme ça, pourquoi pas.


Il y a des règles, ce n'est pas pour rien :-)

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>


1 2 3 4