Se connecter / S'enregistrer
Votre question

[reglé] id aléatoire et unique en php

Tags :
  • MySQL
  • Programmation
Dernière réponse : dans Programmation
19 Septembre 2004 14:55:02

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:


  1. $id=rand(0,100);
  2.  
  3. $req=mysql_db_query($sqlbdd,"SELEC * FROM $table where id=\"$id\"",$cnx)or die("erreur");
  4. $num=mysql_num_rows($req);
  5.  
  6. while($num!=0)
  7. {
  8. header("Location:cette_page.php");
  9. }



Est-ce que quelqu'un à une solution?

Autres pages sur : regle aleatoire unique php

19 Septembre 2004 17:20:15

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
19 Septembre 2004 17:37:51

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.
Contenus similaires
19 Septembre 2004 18:07:54

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?
20 Septembre 2004 12:18:45

Ben dans ta table tu mets un champs id en auto increment et le sql va te gerer ca tout seul :-)
20 Septembre 2004 12:46:08

Citation :

PoUaScAiLLe a écrit :
Ben dans ta table tu mets un champs id en auto increment et le sql va te gerer ca tout seul :-)


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 :

  1. $sql = "SELECT id FROM online ORDER BY id ASC";
  2. $res = mysql_query($sql);
  3. $i = 1;
  4. while(($row = mysql_fetch_array($res)) && !$id){
  5. if(($row["id"] != $i) && !$id){
  6. $id = $i;
  7. }
  8. $i++;
  9. }
  10. $sql = "INSERT INTO online VALUES ('".$id."','".time()."')";


En sortie tu obtiendra $id qui sera l'id le plus bas non enregistré.

21 Septembre 2004 21:58:59

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
22 Septembre 2004 19:30:40

************************************
au depart:
tu fait un tableau de 100
chaque case a la valeur de son indice (tab = 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
22 Septembre 2004 19:59:09

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?
22 Septembre 2004 20:02:37

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.
22 Septembre 2004 20:03:33

Digimag j'avais pas vu ton post.
Je vais essayer sur ton forum.
22 Septembre 2004 20:07:56

Je souhaiterai creer un site commercial, c'est pour des numeros de commande.
22 Septembre 2004 20:09:41

lol... "essayer" :ange: 
Je me mets au travail de maintenant... Je poursuis sur Digimag.
24 Septembre 2004 23:14:14

Quelqun a-t-il une autre idée?
25 Septembre 2004 14:53:25

J'ai déjà fait le script sur les forums Digimag ;-)
28 Septembre 2004 18:48:39

La question n'a toujours pas été reglée.

Quelqun sait comment faire?
29 Septembre 2004 16:14:47

Une âme charitable ? :cry: 
29 Septembre 2004 19:31:22

Vous pouvez me dire pourquoi le script proposé ne marche pas? Quelle est l'erreur renvoyée?
29 Septembre 2004 19:42:15

Je l'ai ecrit sur votre forum samedi:

Je suis tombé sur un nombre qui était deja dans la table.

30 Septembre 2004 18:07:10

J'ai creer un post sur votre forum et vous m'avez donnée un code:
Citation :

<html>
<head>
<title>Id aléatoire</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?
echo "Patientez, calculs du id<br>\n"; //Je ne sais pas si ça va être vraiment utile; script assez rapide

//Connexion, lecture, enregistrements:
mysql_connect("hostname","username","password");
mysql_select_db("database name");
$table="table whis your ids";
$champ="name of the cols with your ids";
$res=mysql_query("SELECT $champ F ROM $table");
$tableau=mysql_num_rows($res);
mysql_close();
$table=""; $champ=""; $res=""; //On libére de la mémoire inutilisée

$possib=array(); $a=0;
for ($i=0;$i<=999999;$i++) //On met dans le tableau $possib[] toutes les possibilitées du nouveau id
{
$ok=TRUE;
for ($n=0;$n<count($tableau);$n++)
{
if ($tableau[$n]==$i)
{
$ok=FALSE;
}
}
if ($ok)
{
$possib[$a]=$i;
$a++;
}
}
$rnd=rand(0,count($possib)-1);
$id=$possib[$rnd];
echo "Votre id: $id<br>\n";
?>
</body>
</html>






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.
30 Septembre 2004 18:10:29

Personne ne sait ? :-(
1 Octobre 2004 00:12:14

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.
1 Octobre 2004 13:10:15

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.
1 Octobre 2004 14:21:30

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.
1 Octobre 2004 16:32:44

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 :p 

Y'a tjs de quoi apprendre en prog :p 
1 Octobre 2004 17:22:45

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à
1 Octobre 2004 17:27:42

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.
1 Octobre 2004 17:40:20

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)
1 Octobre 2004 20:27:39

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. :-?
1 Octobre 2004 20:49:58

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.

++
1 Octobre 2004 21:10:22

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

1 Octobre 2004 21:53:50

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.
1 Octobre 2004 22:16:56

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.
1 Octobre 2004 22:21:15

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)
2 Octobre 2004 13:34:39

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++)
;-)
23 Novembre 2010 14:44:36

Desolé de vous saouler mais je vais soumettre le meme probleme.
je reprends le site web d'une association qui gere les abonnements et cotisation. à chaque creation d'un adherent, je dois tester l'existance d'un ID unique en base avant insertion et gerer aussi le fait quele test doit partir du premier ID possible en base car parfois un adherent est supprimé et ca libere son ID qui peux etre utilisé à nouveau.
J'ai pris la ligne de code plus haut dans le post mais j'ai en retour un ID qui existe deja en base.
--------------------------
$my_sql= "SELECT id FROM $login WHERE 1" ;
$my_rep= mysql_query($my_sql);
$k=intval(substr($login,2,6))*10000;
// $k++;
while (( $myrep = mysql_fetch_array($my_rep)) && !$id){
if (( $myrep["id"] != $k) && !$id){
$id = $k;
}
$k++;
}

Je precise que je suis pas du tout bon en Dev bienque informaticien. Je comprends la logique du code ci-dessus mais je suis incapable de trouver l'erreur.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS