valeur unique et requête. Comment boucler en changeant la valeur ?

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 : valeur unique et requête. Comment boucler en changeant la valeur ?

Re: valeur unique et requête. Comment boucler en changeant la valeur ?

par moogli » 18 avr. 2017, 14:23

oui avec des millions de valeurs c'est tendu de chercher sur la base à chaque fois parce que tu peux te taper 40 recherches pour valider ton code :s

un guid pourrait t'aller
https://fr.wikipedia.org/wiki/Globally_ ... Identifier
=> environ 5 × 10^36 combinaisons possibles.
je crois que ça rentre dans les "plusieurs millions" ?
il y a des librairies qui peuvent générer ce genre de chose, par exemple https://github.com/ramsey/uuid
bon après cela dépend de la fréquence d'utilisation de l'outils, si c'est une fois par an y a moyen de se permettre d'attendre 20 minutes pour un lot de combinaison.
c'est plusieurs fois par jour non ;)


@+

Re: valeur unique et requête. Comment boucler en changeant la valeur ?

par Ehplod » 18 avr. 2017, 12:48

Slt,

Pour clarifier, voici le fonctionnement et les impératif technique (c'est pas moi je décideur).
Je dois créer des valeurs uniques.
Celle-ci ne doivent comporter que lettres (maj et min) et chiffre.
Ces valeurs doivent avoir un nb de caractère le plus faibles, mais au moins égal à 3.
On doit pouvoir obtenir des millions de valeurs unique sur le long terme.

Donc, voici ce que j'ai fait :
Table1 : champ "nb caractère' par défaut à 3

Lorsque je génére ma valeur unique, je récupère le nb de caractère via table1. Au début 3.
Je vérifie s'il est inexistant et je l'écris.
S'il est existant, je boucle jusqu'à 20x.
Si j'arrive à 20 boucles et qu'il n'est toujours pas inexistant, je génère ma valeur sur 4 caractères et je modifie ma table 1 pour les prochains.

Donc, l'idée est de généré un max de valeur unique avec 3 caractères avant de passer à 4, puis 5, etc...

Voilà.

Donc, récupérer le data e, array, puis vérifier avant d'insérer en bdd, j'y ai pensé, mais je me suis dit que si c'est acceptables avec "peu" de valeur, ça risque d'être gros à gérer dés lors qu'on va avoir des millions de valeurs.

Re: valeur unique et requête. Comment boucler en changeant la valeur ?

par moogli » 18 avr. 2017, 09:09

salut,

c'est un peut anti performant, tu risques de passer pas mal de temps dans le while si la base est déjà bien fournie.
La solution serait récupérer les code existant de les mettre dans un tableau et de tester (in_array)
suivant a quoi doit ressemble ton code (intelligible ou pas) il y a des solutions pour avoir quelque chose d'unique comme un guuid (pas un hash md5 ;) ).

@+

Re: valeur unique et requête. Comment boucler en changeant la valeur ?

par Ehplod » 15 avr. 2017, 11:35

ok, merci pour cette confirmation. ;-)

Re: valeur unique et requête. Comment boucler en changeant la valeur ?

par @rthur » 15 avr. 2017, 00:37

Bonjour,

A mon sens c'est la bonne approche, je ne vois pas de problème :)

valeur unique et requête. Comment boucler en changeant la valeur ?

par Ehplod » 14 avr. 2017, 21:26

Slt,

Je suis confronter à un truc qui me questionne.

C'est le principe de l'attribution d'un code promo unique.

Je le génère.
Je teste ma base pour savoir s'il n'existe pas.
Je l'insert.

Vient le cas ou le code existe déjà, donc :

Je le regénère.
Je reteste pour savoir s'il le nouveau n'existe pas.
Je l'insert.

Comment gérer cela au mieux via php/mysql ?
Si je fais une boucle comme si dessous, ça fonctionne, mais est-ce la seule solution ?

Code : Tout sélectionner

$test = 1; while ($test > 0) { $var = genererCode(); $sql = 'SELECT id FROM ma_table WHERE mon_champ_unique =$var ; $res = mysqli_query($connect, $sql); $test = mysqli_affected_rows($connect); } ... en dessous ma requête d'insertion.
Merci. ;-)