06. juni 2007 - 10:44Der er
14 kommentarer og 1 løsning
random nummer - sandsynlighed
Hej eksperter,
jeg sidder med en forespørgselsdimmer og til den skal der genereres et ordrenummer. Til det bruger jeg rand() som er sat: rand(1000, 4000). Det gi'r jo en hel del forskellige kombinationer. Så er det mit spørgsmål lyder
Hvor stor er sandsynligheden for at det samme nummer bliver genereret 2 gange? Kunne man evt. ikke forebygge en dublicate ved så at smide det nummer i en database og hvis der så bliver genereret en dublicate skal scriptet blive bedt om at generere et nyt?
Sandsynligheden er større end 0, så derfor skal du ikke gøre sådan.
Du kan gemme tidligere numre, så du vælger et nyt, hvis det allerede er brugt.
Men - øhm - hvorfor lige på den måde? Når du kommer op i nærheden af 3000 ordrer, skal du prøve rigtig mange gange for at få et nyt - det er ikke sund programmering.
Hvis du istedet for at genere et tilfældigt tal, lader mysql lave et tal som øges automatisk, så slipper du for at tjekke for tallet og du opnår en mere korrekt måde at behandle ordre på.
Nej. Det er enormt langsomt, og dur ikke mht samtidighed, hvad du gør. Ordrenummeret er vel en primær nøgle et eller andet sted. Så sæt ind og se hvor mange http://php.net/mysql_rows_affected - meget hurtigere.
Men det er ikke måden at gøre det på, helt generelt. Hvorfor ikke bare et fortløbende nummer, evt fra en auto_increment/identity ?
Ja okay, nu kan jeg godt se at det er en lidt uheldig måde at gøre det på. Det skal nok bare laves med et stigende nummer så... Hvordan vil I foreslå det kunne laves?
Er ved at ha' en idé om hvordan jeg skal lave det. Måske jeg lige skal nævne at det hele starter med en almindelig form der udfyldes og ved tryk på send, skal der sendes en mail til producenten og en kopi til brugeren - det virker top dollar. Men det er jo også her at ordrenummeret skal sendes afsted, så det skal jo genereres somehow.
Jeg kan vel i sagens natur, blot bruge det unikke ID som ordrenummer? Men hvorfor sendes dette så afsted i samme åndedrag?
Min tabel ser p.t. ud som dette:
orderID | ordernum
Struktur:
orderID int(11) not null auto_increment primary ordernum int(11) not null
så skal der mere på, som navn, email osv. men det er uden betydning i den her sammenhæng.
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.