Avatar billede gedekid Nybegynder
06. juni 2007 - 10:44 Der 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?
Avatar billede erikjacobsen Ekspert
06. juni 2007 - 10:55 #1
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.
Avatar billede gedekid Nybegynder
06. juni 2007 - 11:09 #2
Jeg fik det ændret så den nu vælger mellem 1000 og 99999 - det gi'r lidt flere muligheder.

Den tjekker sådan her nu:

---------------------------------------------

$sql = "SELECT * FROM ordernum";
$result = mysql_query($sql);
if(mysql_num_rows($result) < 1) {
    mysql_query("INSERT INTO ordernum (ordernum) VALUES ('$ordernum')")or die(mysql_error());
} elseif(mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_array($result)) {
        if($row["ordernum"] == $ordernum) {
            $ordernum = rand(1000, 99999);
        }
    }
}

--------------------------------------------------------

Er det en okay måde at lave det på?
Avatar billede dkfire Nybegynder
06. juni 2007 - 11:15 #3
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å.

Hvordan lægger du ordre i din database ??
Avatar billede erikjacobsen Ekspert
06. juni 2007 - 11:17 #4
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  ?
Avatar billede erikjacobsen Ekspert
06. juni 2007 - 11:19 #5
"Det er enormt langsomt, og dur ikke mht samtidighed" ... og virker ikke - så 3 ting er galt! ;)
Avatar billede gedekid Nybegynder
06. juni 2007 - 11:20 #6
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?
Avatar billede gedekid Nybegynder
06. juni 2007 - 11:22 #7
Kunne ordrenummeret laves ved at den først tæller antallet af rækker og derefter lægger 1 til?

Noget med $ordernum = mysql_num_rows($result) + 1; ?
Avatar billede gedekid Nybegynder
06. juni 2007 - 11:23 #8
Eller næh... Nu er jeg selv lidt forvirret :)
Avatar billede pidgeot Nybegynder
06. juni 2007 - 11:31 #9
Som begge de to andre har sagt, brug auto_increment i din tabel, det er det den er der for. Alle andre løsninger vil enten:

a) ikke virke,
b) være sårbare over for en race condition (to der vil indsætte samtidigt), eller
c) være langsommere.

Sagt på anden måde, du får ikke nogen god løsning ud af at gøre det selv. Benyt dig af det MySQL giver dig.

*går igen*
Avatar billede dkfire Nybegynder
06. juni 2007 - 11:41 #10
Hvordan ser dine tabeller ud ??
Avatar billede gedekid Nybegynder
06. juni 2007 - 12:07 #11
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.
Avatar billede gedekid Nybegynder
06. juni 2007 - 12:08 #12
Men hvorfor sendes ... skal være  Men hvordan sendes

eller ville problemet være noget helt andet :)
Avatar billede dkfire Nybegynder
06. juni 2007 - 12:39 #13
Det nemmeste ville at helt klart være at bruge din orderID istedet.
Når du laver en order, så ligger du vel hele ordren ind i databasen ?

Du kan med en mysql_insert_id() få det id som blev lavet ved sidste insert, se evt: http://dk.php.net/manual/da/function.mysql-insert-id.php
Avatar billede gedekid Nybegynder
06. juni 2007 - 13:06 #14
dkfire - din løsning ser ud til at virke upåklageligt! Smid et svar, så får du point!
Jeg takker!
Avatar billede gedekid Nybegynder
28. juni 2007 - 13:49 #15
lukker
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