Avatar billede grinebidder Nybegynder
27. april 2006 - 19:22 Der er 30 kommentarer og
2 løsninger

Oprettelse af unikt nummer

Det er muligt, at svaret allerede står et andet sted, men jeg har bare ikke lige kunnet finde det. Men her kommer så det, jeg efterspørger:

Jeg skal have givet nogle folk i min database et unikt medlemsnummer, som består af, lad os sige 5 cifre. Dette medlemsnummer skaber jeg vha. flg.:

$num = rand(1, 9);
$num1 = rand(0, 9);
$num2 = rand(0, 9);
$num3 = rand(0, 9);
$num4 = rand(0, 9);
$nummer = $num . $num1 . $num2 . $num3 . $num4;


Nu skal jeg så have tjekket efter i databasen, om nummeret allerede eksisterer, og det er ikke så besværligt. Men jeg må komme til kort hvis det skulle ske, at nummeret allerede findes og er så skal genereres et nyt. Hvad så hvis det nye allerede findes etc. etc.

Så hjælp ønskes til dette.
Avatar billede swiatecki Novice
27. april 2006 - 19:27 #1
uhm.. ville det ikke være lettest at give dem numre startende fra 1 og så 2,3,4,5 ?
Avatar billede horizon Nybegynder
27. april 2006 - 19:29 #2
hvad med når den har oprettet en ny id, så at køre den igennem databasen?

noget i stil med mysql_query("SELECT * FROM `tabel???` WHERE `id???` = $num"?)

og så lav en count() for at se om den retunerede 0 eller derover og så en

if(der er ingen match i databasen) {

gør hvad der ellers skal gøres

} else{

start forfra

}?

bare et primitivt forslag, som dog er så simpelt det kun kan virke ;)
Avatar billede horizon Nybegynder
27. april 2006 - 19:31 #3
men ja, det nemmeste er vel som sqiatecki foreslår med at starte fra 0 og gå opefter
Avatar billede grinebidder Nybegynder
27. april 2006 - 19:53 #4
Jo, det ville være lettest, men numrene skal være på flere cifre af flere grunde.

Horizon: Ja, det er jo en måde, men hvordan fortæller du den, at den skal starte forfra igen (der hvor du skriver »start forfra«). Jeg kan jo indsætte koden hele igen, men den skal jo helst blive ved med at tjekke uendeligt i det tilfælde, at den bliver ved med at finde et nummer, der allerede eksisterer ...
Avatar billede arne_v Ekspert
27. april 2006 - 19:57 #5
SELECT og saa INSERT er ikke sikker i flerbruger sammenhaeng

(omend i den konkrete situation er meget meget usandsyneligt at det skulle
give et problem)
Avatar billede coderdk Praktikant
27. april 2006 - 19:58 #6
Er det ikke lettere med:

$nummer = mt_rand(10000,99999)

? :)
Avatar billede arne_v Ekspert
27. april 2006 - 20:00 #7
normalt bruger man et felt som selv producerer en unik vaerdi (MySQL: AUTO_INCREMENT)
til den slags
Avatar billede horizon Nybegynder
27. april 2006 - 20:03 #8
->arne_v

(gik ud fra at han ikke havde den mulighed (hvorfor ved jeg ikke... nå!))

->grinebidder

nu vil jeg sige du skal bruge "auto_increment" som arne_v pointerer, men ellers er du i en situation hvor du kan få brug for at kalde funktionen flere gange, så opret koden første gang i en funktion, så kald funktionen, så er det hele så meget nemmere og hurtigere.
Avatar billede grinebidder Nybegynder
27. april 2006 - 20:18 #9
Ja, men nu vil jeg ikke bruge auto_increment, da den allerede bruges én gang i denne række.

Horizon: Vil du så ikke lige fortælle mig, hvordan jeg skal lave lave funktionen, for at den bliver ved med at loope indtil den finder et nummer, der ikke er brugt?
Avatar billede horizon Nybegynder
27. april 2006 - 20:29 #10
ehm... jeg prøver...

<?php

function LoopID(){
    global $nummer;
   
    include("dbconnect.php");    /*eller hvordan nu nu skaber forbindelse til MySql*/

    $hent = mysql_query("SELECT COUNT(*) AS `Resultat` FROM `DinTabel` WHERE `ID` = $nummer");
    $hits = mysql_fetch_array($hent);

    if($hits[Resultat] == 0){
        /*hvad den nu ellers skal gøre herefter*/
    }else
        SkabID();
}

function SkabID(){
    $num = rand(1, 9);
    $num1 = rand(0, 9);
    $num2 = rand(0, 9);
    $num3 = rand(0, 9);
    $num4 = rand(0, 9);
    $nummer = $num . $num1 . $num2 . $num3 . $num4;
   
    LoopID();
}

?>
Avatar billede arne_v Ekspert
27. april 2006 - 20:31 #11
der er korrekt at du kun kan have en kolonne med auto_increment, men
hvis du allerede har et unikt felt hvorfor saa have et mere ?
Avatar billede grinebidder Nybegynder
27. april 2006 - 20:40 #12
Arne_v: Fordi jeg skal bruge et mere unikt nummer, som ikke lige er til at aflure. Og det er den jo med auto_increment :/

Horizon: Takker, det var jo lige det :) Så jeg kalder bare LoopID() når jeg skal bruge funktionen, ikke?
Avatar billede horizon Nybegynder
27. april 2006 - 21:16 #13
nu har jeg ikke testet om det virker, men ser umiddelbart sådan ud, men du skal kalde SkabID(), ikke LoopID(). Hvis du ser i SkabID(), så kalder den automatisk LoopID() når den har lavet nummeret.
Avatar billede grinebidder Nybegynder
27. april 2006 - 21:19 #14
Jeps, det fandt jeg også ud af lige da jeg havde skrevet her, hehe. Anyway, den står bare og loop'er og giver til sidst en timeout :/ Der hvor du skriver 'Resultat', er det så ligegyldigt hvilken kollonne, jeg angiver her?
Avatar billede horizon Nybegynder
27. april 2006 - 21:25 #15
der i mysql tråden hvor der står Resultat skal du ikke ændre noget, det er det som variablen hedder nede i $hits[Resultat], det eneste du skal ændre er hvordan du skaber forbindelse til databasen, samt der hvor der står `DinTabel` skal jo være den table den skal checke efter... ID er den kollone som den skal se efter
Avatar billede horizon Nybegynder
27. april 2006 - 21:36 #16
sker fejlen fortsat?
Avatar billede grinebidder Nybegynder
27. april 2006 - 21:42 #17
Ja
Avatar billede coderdk Praktikant
27. april 2006 - 21:46 #18
Altså ser

    $nummer = rand(10000,99999);

ikke bedre ud end:


    $num = rand(1, 9);
    $num1 = rand(0, 9);
    $num2 = rand(0, 9);
    $num3 = rand(0, 9);
    $num4 = rand(0, 9);
    $nummer = $num . $num1 . $num2 . $num3 . $num4;

;) Desuden bør man bruge mt_rand da den er lidt mere tilfældig end rand :)
Avatar billede grinebidder Nybegynder
27. april 2006 - 21:48 #19
coderdk: Joe, den overså jeg vist lige. Danke :)
Avatar billede horizon Nybegynder
27. april 2006 - 21:53 #20
hvad sp med 00001 og opefter? hmm.. prøver at finde ud af hvad der er i vejen med scriptet?
Avatar billede coderdk Praktikant
27. april 2006 - 21:59 #21
horizon, Dem har du heller ikke med i dit script ;) Den kode du har brugt producerer samme resultat som min ene linje ;) Jeg går ud fra at 00001-09999 ikke "ser godt nok ud" ;) For ellers var det jo bare at lave:

$nummer = sprintf( "%05d", mt_rand( 99999 ) );
Avatar billede grinebidder Nybegynder
27. april 2006 - 21:59 #22
I mit oplæg skulle det første tal være mellem 1 og 9, så det er rigtig nok, hvad coderdk siger. Men det fungerer stadig ikke, her er, hvad jeg har til at stå:

$hent = mysql_query("SELECT COUNT(*) AS 'Resultat' FROM tjek_user_info WHERE medlemsnr='$medlemsnummer'");
Avatar billede coderdk Praktikant
27. april 2006 - 22:06 #23
while (true)
{
  $medlemsnummer = mt_rand(10000,99999);
  $qh = mysql_query("SELECT 1 FROM tjek_user_info WHERE medlemsnr='$medlemsnummer'");
  if ( mysql_num_rows( $qh ) == 0 )
  {
      break;
  }
}
Avatar billede coderdk Praktikant
27. april 2006 - 22:07 #24
(Så har du en der er ledig - Så skal du naturligvis bruge en INSERT for at gemme, sammen med de øvrige data)
Avatar billede horizon Nybegynder
27. april 2006 - 22:11 #25
nååh den så jeg ikke lige. :P og godt der er nogen til at rette mit slamkodning så andre kan få det til at virke ;)
Avatar billede freegeg Nybegynder
28. april 2006 - 00:43 #26
du kan jo også putte lidt bogstaver i din "serial"

    $num = chr(rand(65,90));
    $num1 = chr(rand(65,90));
    $num2 = rand(0, 9);
    $num3 = rand(0, 9);
    $num4 = rand(0, 9);
    $nummer = $num . $num1 . $num2 . $num3 . $num4;

det kan give en bedre unikhed :)
Avatar billede fynbo Nybegynder
28. april 2006 - 01:48 #27
lav et felt i databasen med auto_increment og så int(10) fx og sæt det til at være unikt.

Hvis du så vil starte med 100.000, så indsætter du en række, hvor du SELV angiver en værdi i det felt, som du lige har sagt at databaseb selv skal udfylde. Her skriver du 99.999.

Næste række vil så starte med 100.000 og du har dit flere-cifret tal.
Avatar billede fynbo Nybegynder
28. april 2006 - 01:51 #28
Har lige læst overstående igennem og ser nu at du allerede har ét felt som har auto_increment og derfor ikke kan bruge det igen.

Istedet kan du oprette en tabel som kun har ét felt, der fx hedder medlemsnummer og der sætter du en værdi til fx. 100.000 og fremover når du så oprettet en bruger, så fixer du en kode som gør følgende:

Tag det nummer som står i tabellen "medlemsnummer" og brug det.
Forøg nummeret i medlemsnummer med 1, således det er klar til brug igen.

Du har to fordele - du får fortløbende numre og du kan selv bestemme hvilket nummer der skal starte, ligesom du ved hvilket nummer en ny eventuelt bruger vil få.
Avatar billede grinebidder Nybegynder
28. april 2006 - 09:22 #29
coderdk: Tak. Hvis du opretter et svar deler jeg point mellem dig og horizon.

freegeg: Nu var det ikke fordi jeg ville have en unik serial men bare et unikt nummer.

fynbo: Jep, det er også en mulighed, men så kan kan jeg jo i princippet ligeså godt bruge det autogenererede id, der allerede er i min tabel. Der er ikke meget random over en automatisk stigning ...
Avatar billede coderdk Praktikant
28. april 2006 - 09:56 #30
Ok :)
Avatar billede arne_v Ekspert
29. april 2006 - 03:22 #31
hvis det absolut skal være unikt så husk og sæt et unikt index på feltet

(SELECT testet er kun 99.9% sikkert i en flerbruger kontekst)
Avatar billede freegeg Nybegynder
29. april 2006 - 06:50 #32
korrekt, altid det problem... vis man elsker at scripte, kan man jo lave et lille program, man står i kø til får at få lavet et id.. så man sikker på at kun eet id bliver lavet af gangen, også man så ikke så uheldig at 2 id bliver oprette på nøjagtig samme tid... chancen for det sker, er ca. den samme somat vinde i lotto 2-3 gange i træk.. men det kan stadig ske i teorien.

med al respekt til arne_v jeg prøver ikke på at være sarkastisk, som programmør arbejder man jo i teori, så man skal tage hensyn til hvad der kan ske
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester