[reglé] id aléatoire et unique en php
Forum Programmation : [reglé] id aléatoire et unique en php
Salut tout le monde,
Je voudrais enregistrer un id compri entre 0 et 100 dans ma table à chaque fois qu' on accede à une de mes pages et il faut que cet id ne soit pas déja present dans ma table.
J'ai créé ce code qui execute ma page à l'infini jusqu'a qu'il trouve un id qui n'est pas deja present dans la table, mais c'est beaucoup trop lent:
$id=rand(0,100);
$req=mysql_db_query($sqlbdd,"SELEC * FROM $table where id=\"$id\"",$cnx)or die("erreur" );
$num=mysql_num_rows($req);
while($num!=0)
{
header("Location:cette_page.php" );
}
Est-ce que quelqu'un à une solution?
lol, plus simple. tu charges toutes les valeurs de ta table dans une var.
ensuite tu generes ton id.
et la tu verifie s'il est pas dedans.
s'il est dedans tu regenere un id
et une fois que tu trouves un id qui n'est pas dans la table la seulement tu changes de page.
// requete sql qui charge les valeurs
//creation d'un id
//boucle while tant que l'id est deja present. + creation d'un nouvel id
// sortie de la boucle et suite de ton code.
PS : Mais l'id ? tu le mets pas dans la base de données apres ?
ca va vite limiter le nbr de fois que ta page va marcher lol
Tu pourrais tout simplement prendre la date et l'heure, auquel tu ajouteras un nombre aléatoire ... la probabilité pour que tu ais deux fois le même sera extrèmement faible.
C'est pas vraiment un id que je veux creer, sinon j'aurai utilisé un truc du genre:
| Citation : md5(uniqid(rand())); |
Non c'est un numero avec un minimum de chiffres.
T'a pas un exemple de code resurectin pour faire ce que tu as dit?
Ben dans ta table tu mets un champs id en auto increment et le sql va te gerer ca tout seul :-)
| Citation :
|
A ce que j'ai compris, tu veux faire une id unique et le plus petit possible, pou eviter d'avoir des 'AUTO INCREMENT' trop grand avec le temps (c'est vrai qu'il faut prendre ca en considération).
Donc une boucle derrière une requette SQL me semble pas mal, on va se baser sur un base SQL de ce type :
table = online
id (int 3)
lastseen (varchar 20)
script PHP :
$sql = "SELECT id FROM online ORDER BY id ASC";
$res = mysql_query($sql);
$i = 1;
while(($row = mysql_fetch_array($res)) && !$id){
if(($row["id"] != $i) && !$id){
$id = $i;
}
$i++;
}
$sql = "INSERT INTO online VALUES ('".$id."','".time()."')";
En sortie tu obtiendra $id qui sera l'id le plus bas non enregistré.
Merci les gars.
En fait il faut que ce numero soit aléatoire: je ne veux pas que les personnes a qui je donne ce numero sache qu'elles sont la n ieme a en avoir recu un. ;-)
Je voudrais que la premiere personne qui se connecte puisse aussi bien obtenir un grand nombre qu'un petit. :-D
Vous avez une idée?
************************************
au depart:
tu fait un tableau de 100
chaque case a la valeur de son indice (tab[i] = i)
pour chaque id nécessaire
random sur le tableau de (taille n)
recupération de la valeur
suppression de la case qui contient la valeur
(le tableau aura une taille de n-1)
*************************************
3 choses :
-je sais plus ce kon utilise pour faire les tableaux (ca fait kelke mois ke jai plus fait de php... j'ai oublié)
-je sais pas si c plus rapide (se trimbaler un tableau c pas génial, mais comme il est pas tres gros...)
edit :
-bein finalement ya pas de 3e
Je peux te le faire. A condition que tu postes une demande ici:
Digimag - Création des scripts gratuits
Sinon, je teconseille de réflechir et de faire ton programme (script) toi-même.
Merci captaincom.
Le probleme c'est que que je travaille sur tables sql et en fait je veux generer des numero de commande a 6 chiffres.
Ca va faire une table d'1 million d'enregistrement :-o
Une autre idée?
C'est quoi, le but? Si c'est pour faire des tirages au sort, tu peux enregistrer tout le monde l'un après l'autre, ensuite faire un tir... Sinon, je te le ferai ce soir si tu t'enregistres.
Digimag j'avais pas vu ton post.
Je vais essayer sur ton forum.
Je souhaiterai creer un site commercial, c'est pour des numeros de commande.
lol... "essayer"
Je me mets au travail de maintenant... Je poursuis sur Digimag.
Quelqun a-t-il une autre idée?
J'ai déjà fait le script sur les forums Digimag ;-)
La question n'a toujours pas été reglée.
Quelqun sait comment faire?
Une âme charitable ?
Vous pouvez me dire pourquoi le script proposé ne marche pas? Quelle est l'erreur renvoyée?
Je l'ai ecrit sur votre forum samedi:
Je suis tombé sur un nombre qui était deja dans la table.
J'ai creer un post sur votre forum et vous m'avez donnée un code:
| Citation :
|
Ce code renvoie des id qui existent deja dans la table, ce que j'ai expliqué il y a 5 jours sur votre forum, et depuis pas de réponse.
Si la seule chose que vous voulez c'est attirer du monde sur votre forum et empecher ceux qui savent de me repondre, en empechant chaque relance du sujet sur infos du net et en affirmant que votre code marche, je vous prierai de ne plus me repondre.
Personne ne sait ? :-(
Bon, vu que ca me bouffe mon script et que j'ai pas envie de modifier pour que ca passe et vu que c'est fait a la va vite. Je te met un lien vers un txt le contenant
ici
Ceci, n'insert pas la valeur trouver dans la table.
un ptit insert et c'est fini.
Moi, je te dis: ce script enverra toujours un nombre aleatoire compris entre 0 et 100.
L'erreur est dans la boucle while:
$verif = "true"; veut dire que la condition de la boucle while ($verif=="false" ) n'est pas satisfaite, donc on sort de cette boucle tout de suite.
Je vais voir pourquoi chez moi ça marche pas.
Et d'ailleurs j'ai trouvé mon erreur. Maintenant ça marche.
Désolé pour un si long temps: je n'ai pas vu votre réponse. J'ai mis [Réglé?] car j'en étais pas sûr mais je n'avais pas des résultats.
Excusez-moi.
En regardant bien, il y a une autre boucle dans le while.
Tu devrais mieu regarder.
j'ai la flemme d'expliquer.
Si je me souviens bien, c'est toi qui te "vantait" de tes talents sur le topic des études pour devenir développeur ?
C'est pourtant du code de base.
edit : d'ailleur, il manque un "$" pour une var dans la boucle for justement de mon script
Y'a tjs de quoi apprendre en prog
Oui, oui.
D'accord, je n'étais pas assez attentif.
Mais ton script, il cherche aléatoirement! Il mettra cent ans pour "boucher" le dernier id. Faire queque chose au pif n'est point une bonne methode. Et un beau zéro nous sert à rien s'il n'y a plus de id disponible!
Et puis toi-même, tu avoues que tu as fait une faute (oubli de $). Et pourtant ça aussi, c'est de l'initiation!
Alors ne m'attaquez pas. Je n'ai pas vu qu'un nouveau message est arrivé sur mon forum, donc je pensais que c'est réglé. Quand je m'en suis aperçu, j'ai fait tout de suite deux versions, car c'est ma propre faute.
Croyez toujours pas? Par là
Tu as tout a fait raison sur le fait que ca génére un id aleatoire.
Je n'ai fait que restructurer la pensée du posteur originelle.
> sinon, je n'ai pas attaquer ton code, je l'ai meme pas lu. je disais ca juste par rapport a ta remarque a coté de la plaque.
Désolé, si ca t'as pas plus.
Qu'est-ce que ne m'a pas plu?
Tiens, pour vérifier (déjà queques nombres pris):
Test
Ca va de 0 à 100, tu peux cliquer et enregistrer sur un papier les résultats jusqu'à arriver à un message d'erreur. (Ca va pas être long: j'ai déjà cliqué une ventaine de fois)
Merci les gars,
Digimag j'ai du me tromper à ton sujet. Ton deuxième script marche tres bien.
PS: Resurectin j'ai testé ton script et chez moi il me renvoi des numeros déja existants dans la table. :-?
Aller, juste par aquis de conscience, j'ai testé mon script, et il n'a jamais sortie une seule valeur deja dans la base de données.
T'as du te rater en l'utilisant.
Si tu fais une requete sql fausse au depart
ca pourrait expliquer ton erreur.
++
j'ai remplacé
| Citation : for ($j=0; $j<=$i; j++) |
par
| Citation : for ($j=0; $j<=$i; $j++) |
et
| Citation : $id_trouver=rand(0,100); |
par
| Citation : $id_trouver=rand(0,10); |
J'ai enregistrer le numero à chaque fois dans la table et la requette sql contient le nom de mon champs et de ma table.
C'est bizare, je vois pas ou j'ai fait une erreur
Excuse moi resurectin ton script est genial et tres rapide.
Tu as souvent répondu aux quelques posts que j'ai créé sur ce forum et je t'en remerci. J'espere moi aussi pouvoir t'aider en quoi que ce soit.
Le nom de mon champs ne s'appelle pas "id" et j'avais oublier de modifier:
| Citation : $indice[$i] = "$art->id"; |
Désolé encore.
Effectivement, le script proposé par resurectin est rapide si on conte jusqu'à 999, par exemple.
Mais si ça va plus loin? Imaginons qu'il y a 1000000 possibilités dont 999999 sont déjà prises! Le script va essayer de trouver le seul nombre non-pris au pif et il mettra enormement du temps. Il y a une chance sur une mille pour tomber sur le bon nombre! Après la millieme tentative (en moyene - peut être plus (!) peut être moins) ça va être bon. Il peut arriver que le résultat sera affiché très vite (trouvé d'un seul coup) mais il peut bien arriver que le résultat sera trouvé seulement après queques dizaines de secondes.
A priori, ça va... mais il s'agit ici d'un "si jamais"...
Ce n'est pas la première fois que ce genre de problèmes m'arrive. J'ai déjà conçu un script pour un chercheur scientifique, qui, en gros, met un certain nombre des sphères de n'importe quelle dimension et n'importe où dans un espace 3D. Régle: il ne fat pas que ces sphères se touchent. Soit on choisit ces valeurs aléatoirement et ça va très vite au début et extra lentement à la fin soit on récalcule toutes les possiblités et on en choisit une aleatoirement à chaque fois. Dans la plupart des cas, la deuxième solution est plus rapide. (programme en QB 4.5 compilé à l'aide de brun45.exe)
Conclusion: Parfois, l'efficacité d'un script peut se voir seulement après un ou plusieurs tests.
Et tu pourrais adapter ton script pour creer un nombre à 6 chiffres?
L'avantage avec le script de resurectin c'est que j'ai juste à mettre
| Citation : rand(111111,999999) |
Tu pourra facilement le faire seul. Ligne 21 de la deuxieme version:
Rempalcer
for ($i=0;$i<=$max;$i++)
Par:
for ($i=111111;$i<=$max;$i++)
;-)
Il y a 223 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
