Avatar billede cpfrande Nybegynder
03. juli 2003 - 17:16 Der er 10 kommentarer og
1 løsning

Auto-generering af tal, samt forefindelse af tal ud fra MySQL.

Hej !

Jeg er ved, at lave en funktion (eller flere) der gør det muligt, at skabe et medlemsnummer (til f.eks. en klub).

Jeg har lavet følgende kode:
function find_serie() {
do {
$res_serie = mysql_query("SELECT serie FROM serier WHERE type='passiv' LIMIT 1");
$db_serie = mysql_fetch_array($res_serie);
$serie = $db_serie[serie];
} while(check_serie($serie));
return $serie;
}

function check_serie($serie) {
$res_check_serie = mysql_query("SELECT id FROM medlemsnumre WHERE serie='$serie'");
if (mysql_num_rows($res_check_serie) != "99999") {
return true;
}
else {
return false;
}
}

function make_nummer() {
srand ((double) microtime() * 100000);
do {
$pos_chars = "1234567890";
$nummer = substr($pos_chars, rand(0, strlen($pos_chars)-2), 1);
for($i = 1; $i < 6; $i++) {
$nummer .= substr($pos_chars, rand(0, strlen($pos_chars)-1), 1);
}
} while(check_nummer($nummer));
return $nummer;
}

function check_nummer($nummer) {
$res_check_nummer = mysql_query("SELECT nummer FROM medlemsnumre WHERE nummer='$nummer'");
if (mysql_num_rows($res_check_nummer) == "0" && $nummer != "00000") {
return true;
}
else {
return false;
}
}

$countrycode = 045; // Denmark
$serie = find_serie();
$nummer = make_nummer();
$medlemsnummer = $countrycode . "-" . $serie . "-" . $nummer;

Meeeeen koden står bare og loader, hvorefter den skriver, at maximum-loading tid er overskredet.

For mig lyder det til, at koden har et "hul", som gør, at den bliver ved med at genere en af de tallene.

Jeg syntes du ikke jeg kan finde et hul, hvilket gør, at jeg nu søger hjælp her.

Har i spørgsmål til koden besvare jeg med glæde.

Kan I finde fejlen?

- frande
Avatar billede tipsen Nybegynder
03. juli 2003 - 17:18 #1
Til gavn for andre læsere:

function find_serie() {
    do {
        $res_serie = mysql_query("SELECT serie FROM serier WHERE type='passiv' LIMIT 1");
        $db_serie = mysql_fetch_array($res_serie);
        $serie = $db_serie[serie];
    } while(check_serie($serie));
    return $serie;
}

function check_serie($serie) {
    $res_check_serie = mysql_query("SELECT id FROM medlemsnumre WHERE serie='$serie'");
    if (mysql_num_rows($res_check_serie) != "99999") {
        return true;
    }
    else {
        return false;
    }
}

function make_nummer() {
    srand ((double) microtime() * 100000);
    do {
        $pos_chars = "1234567890";
        $nummer = substr($pos_chars, rand(0, strlen($pos_chars)-2), 1);
        for($i = 1; $i < 6; $i++) {
            $nummer .= substr($pos_chars, rand(0, strlen($pos_chars)-1), 1);
        }
    } while(check_nummer($nummer));
    return $nummer;
}

function check_nummer($nummer) {
    $res_check_nummer = mysql_query("SELECT nummer FROM medlemsnumre WHERE nummer='$nummer'");
    if (mysql_num_rows($res_check_nummer) == "0" && $nummer != "00000") {
        return true;
    }
    else {
        return false;
    }
}

$countrycode = 045; // Denmark
$serie = find_serie();
$nummer = make_nummer();
$medlemsnummer = $countrycode . "-" . $serie . "-" . $nummer;
Avatar billede cpfrande Nybegynder
03. juli 2003 - 17:19 #2
Undskyld stavefejlene.

Teksten (uden så mange tydelige fejl):
Meeeeen koden står bare og loader, hvorefter den skriver, at maximum-loading tid er overskredet.

For mig lyder det til, at koden har et "hul", som gør, at den bliver ved med at genere tallene.

Jeg syntes dog ikke, at jeg kan finde et hul, hvilket gør, at jeg nu søger hjælp her.

Har i spørgsmål til koden besvare jeg med glæde.

Kan I finde fejlen?
Avatar billede tipsen Nybegynder
03. juli 2003 - 17:19 #3
if (mysql_num_rows($res_check_nummer) == 0 && $nummer != "00000") {
Avatar billede tipsen Nybegynder
03. juli 2003 - 17:21 #4
Ville det ikke være en bedre ide med fortløbende medlemsnumre - det andet bliver da ét kæmpe rod!?
Avatar billede cpfrande Nybegynder
03. juli 2003 - 17:21 #5
Hehe tipsen, jeg havde også indryk i min. Jeg bruger bare tab, men det fucker op på eksperten.dk, så jeg valgte at fjerne dem :)

Men tak for hjælpen :o)
Avatar billede opperen Nybegynder
03. juli 2003 - 17:21 #6
Jeg kan godt se hvad fejlen er. Check_nummer returnerer true når det ikke allerede findes i databasen. Make_nummer har en while løkke der kører sålænge check_nummer returnerer true (altså i alle tilfælde hvor nummeret ikke findes i forvejen).
lav
} while(check_nummer($nummer));
om til
} while(! check_nummer($nummer));
Avatar billede tipsen Nybegynder
03. juli 2003 - 17:22 #7
Og det er da også lidt ressourcespild at stå og gætte medlemsnumre for derefter at spørge om de allerede er taget for så at gætte videre - i stedet for bare at tage næste ledige nummer...
Avatar billede cpfrande Nybegynder
03. juli 2003 - 17:27 #8
Tak tak, det var jo svaret :)
Avatar billede cpfrande Nybegynder
03. juli 2003 - 17:28 #9
tipsen: Hvordan kan jeg lave det???
Avatar billede tipsen Nybegynder
03. juli 2003 - 18:22 #10
brug noget auto_increment felt i mysql - og lav evt. auto-udfyldning med 0'er - evt. brug medlemsnummeret som primary key!
Avatar billede cpfrande Nybegynder
03. juli 2003 - 18:32 #11
Ahh... okey, jeg prøver...
Endnu engang tak for hjælpen :)
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