Comment limiter la plage d'une colonne mysql?

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 : Comment limiter la plage d'une colonne mysql?

par Truc » 03 oct. 2005, 21:58

J'admet que c'était déplacé si c'est effectivement une "présentation" faite maison :wink:

surtout que c'est interessant =D>

sans rancune sadeq (il n'y avait pas de mauvais fond ) :merci:

par Cyrano » 03 oct. 2005, 12:04

Il vrai Truc que ton intervention était quelque peu indélicate, évite donc à l'avenir, merci.

par sadeq » 03 oct. 2005, 11:44

....

C'est un cours particulier la :lol:
Il vient d'où tout ce blabla qui a été copié/collé :wink:
Je ne comprends pas ce genre d'intervention!
On passe des heures a concevoir une réponse qui peut intéresser les gens et finalement on reçoit de telle intervention plein la geulle.

Au sages d'en juger...

par Truc » 30 sept. 2005, 19:22

Les types numérqiues autorisés par MYSQL sont:

Code : Tout sélectionner

Type Octets De A TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807
Pour ce qui est d'une plage numérique personnalisée celà s'appelle une contrainte ou règle de validité de ....................
C'est un cours particulier la :lol:
Il vient d'où tout ce blabla qui a été copié/collé :wink:

par sadeq » 30 sept. 2005, 14:35

Les types numérqiues autorisés par MYSQL sont:

Code : Tout sélectionner

Type Octets De A TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807
Pour ce qui est d'une plage numérique personnalisée celà s'appelle une contrainte ou règle de validité de champ ou rules en anglais.

Mysql (ver < à 5) n'intègre par de rules ou triggers automatiques comme on peut trouver sous Access, SQL Server ou Oracle. Mais on peut toujour utiliser des fonctions de validation écrites en PHP (comme l'a montré CYRANO)

Par contre pour utiliser Mysql pour le controle on doit utliser des procédures stockées ou des triggers. Mais pour ça il faut avoir au minimum un Mysql version 5.

Dans ton cas, une procédure doit contôler les entrées avant l'ajout et la mise à jour des champs concernés.

Dès l'ors, la validité d'une "valeur_à_entrer" dans un champ numérique par rapport à une plage numérique [valeur_min, valeur_max] peut être vérifiée comme suit :
Règle

Code : Tout sélectionner

IF valeur_à_entrer < valeur_min THEN valeur_à_entrer = valeur_min ELSE IF valeur_à_entrer > valeur_max THEN valeur_à_entrer = valeur_max
Ces deux tests sont sensés retourner la valeur valide à entrer .

Exemple :
La palge de validité : [100, 10000]

Pour la valeur entrée : 99
La règle retourne normalement 100

Pour la valeur entrée : 110
La règle retourne normalement 110

Pour la valeur entrée : 99999
La règle retourne normalement 10000

Voici un exemple de procédure d'ajout qui effectue ce type de contôle :
Contexte:
soit la procédure "ajout_dans_t1" qui doit ajouter des valeurs numériques dans la table t1 après avoir effectué un contrôle de validité.

Pour créer la procédure:

Code : Tout sélectionner

CREATE PROCEDURE `ajout_dans_t1`(IN p1 INT) BEGIN IF p1<100 THEN SET p1=100; ELSEIF p1>10000 THEN SET p1=10000; END IF; INSERT INTO t1 (valeur1) VALUES (p1); END
Pour effectuer l'ajout validé il suffit alors d'appeler cette procédure avec la commande :
CALL ajout_dans_t1 (valeur_à_entrer)
Dans ce cas, au lieu d'exécuter une requête INSERT directe sur la table t1, il suffit d'appeler la procédure qui s'occupe de la validation des entrées et de l'INSERT définitif.

Exemple :
CALL ajout_dans_t1 (99) > ajoute la valeur 100 dans la table t1 puisque 99 sera corrigée par le "IF" de la procédure appliqué avant "INSERT"

Une autre solution consiste à créer un TRIGGER qui observe les actions INSERT et qui effectue la validation avant d'appliquer l'insertion.
L'avantage du TRIGGER est qu'il est automatiquement exécuté lors d'un ordre INSERT normal (autrement dit, on n'a plus besoin d'appeler une procédure spéciale par un CALL)
Un tel TRIGGER s'écrit selon l'exemple précédent :

Code : Tout sélectionner

CREATE TRIGGER valider BEFORE INSERT ON t1 FOR EACH ROW BEGIN IF NEW.valeur1 < 100 THEN SET NEW.valeur1 = 100; ELSEIF NEW.valeur1 > 10000 THEN SET NEW.valeur1 = 10000; END IF; END
où:

BEFORE INSERT ON t1 : désigne que le trigger est déclenché avant l'application de l'INSERT. Les valeurs à ajouter dans la table sont alors stockées temporairement dans une table système nommée "NEW"

NEW : désigne la table temporaire créée par le trigger pour gérer la transaction d'ajout.
NEW hérite de la structure de la requête INSERT et contient les champs et valeurs à entrer (celles qui se trouvent dans la clause VALUES de l'INSERT)

Dans cet exemple : NEW.valeur1 désigne alors la valeur à entrer dans le champ valeur1 de la table t1. Ce champ est traité par le trigger avant de confirmer l'ajout définitif.

Pour exécuter ce trigger il suffit de lancer une reqûete INSERT normale
Exemple : INSERT INTO t1 (valeur1) VALUES (99) > ajoute 100 dans valeur1 après l'intervention automatique et transparente du trigger.

par Cyrano » 30 sept. 2005, 12:58

Tu peux traiter ces valeurs par programmation avant de les envoyer vers la base. Tu mets un champ en INT dans la table et pour le traitement, tu fais deux alternatives en PHP:
// Si la valeur est inférieure à 100, on met 100 par défaut;
$valeur = ($valeur < 100) ? 100 : $valeur;
// Si la valeur est supérieure à 100000 on met à 100000 par défaut.
$valeur = $valeur > 100000) ? 100000 : $valeur;
//... suite de l'enregistrement dans la base de donnée de la valeur.

par bulma » 30 sept. 2005, 12:18

Désolé si cétait pas assez clair, je vais essayer d'être plus claire cette fois-ci.

J'aimerai créer une colonne dans une table Mysql qui me permettrai d'y stocker des nombres allant de 100 à 100000, donc si j'éssaye d'enregistrer la valeur 99 il enregistrera 100 vu qu'il est limité à 100 minium.

J'éspére que j'ai été claire dans l'explication de mon probléme.

Merci.

par Cyrano » 30 sept. 2005, 12:03

On peut savoir de quoi vous parlez avant que je n'envoie ce sujet pour l'instant absolument sans intérêt dans la poubelle ? :evil:

Question claire => réponse claire;
Question floue => réponse hasardeuse ou pas de réponse du tout !

par Invité » 30 sept. 2005, 12:00

de 100 à 10000 par exemple. Ca va ressembler à un truc comme BIGINT (100,10000) ???

par Cyrano » 30 sept. 2005, 11:54

De 100 quoi à xxx quoi au juste ?

Comment limiter la plage d'une colonne mysql?

par bulma » 30 sept. 2005, 11:52

Bonjour à tous,

J'aimerai savoir si il est possible de limiter une colonne dans Mysql. Par exemple de 100 à xxx ou de 100 à nolimit.

Merci beaucoup pour votre aide.
Bulma