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

Eléphant du PHP | 85 Messages

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. ;-)

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7420 Messages

15 avr. 2017, 00:37

Bonjour,

A mon sens c'est la bonne approche, je ne vois pas de problème :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 85 Messages

15 avr. 2017, 11:35

ok, merci pour cette confirmation. ;-)

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

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 ;) ).

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

Eléphant du PHP | 85 Messages

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.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

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 ;)


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