Tom's Guide > Forum > Programmation > [reglé] id aléatoire et unique en php

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

Forum Programmation : [reglé] id aléatoire et unique en php

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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?

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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

Répondre à Resurectin

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.

Répondre à furbean

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?

Répondre à SonnyCrockett

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

Répondre à PoUaScAiLLe

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 :

$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é.

Répondre à Cool@IDN

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

Répondre à SonnyCrockett

************************************
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

Répondre à captaincom

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.

Répondre à Digimag

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?

Répondre à SonnyCrockett

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.

Répondre à Digimag

Digimag j'avais pas vu ton post.
Je vais essayer sur ton forum.

Répondre à SonnyCrockett

Je souhaiterai creer un site commercial, c'est pour des numeros de commande.

Répondre à SonnyCrockett

lol... "essayer" :ange:
Je me mets au travail de maintenant... Je poursuis sur Digimag.

Répondre à Digimag

Quelqun a-t-il une autre idée?

Répondre à SonnyCrockett

J'ai déjà fait le script sur les forums Digimag ;-)

Répondre à Digimag

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

Quelqun sait comment faire?

Répondre à SonnyCrockett

Vous pouvez me dire pourquoi le script proposé ne marche pas? Quelle est l'erreur renvoyée?

Répondre à Digimag

Je l'ai ecrit sur votre forum samedi:

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

Répondre à SonnyCrockett

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.

Répondre à SonnyCrockett

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.

Répondre à Resurectin

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.

Répondre à Digimag

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.

Répondre à Digimag

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

Répondre à Resurectin

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à

Répondre à Digimag

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.

Répondre à Resurectin

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)

Répondre à Digimag

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. :-?

Répondre à SonnyCrockett

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.

++

Répondre à Resurectin

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

Répondre à SonnyCrockett

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.

Répondre à SonnyCrockett

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.

Répondre à Digimag

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)

Répondre à SonnyCrockett

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

Répondre à Digimag
Tom's Guide > Forum > Programmation > [reglé] id aléatoire et unique en php
Aller à :

Il y a 223 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens