Avatar billede mysli Nybegynder
28. marts 2005 - 00:56 Der er 10 kommentarer og
1 løsning

Problem ved login funktion.

Jeg er lavet følgende funktion i php.

function userLogin($name, $password){
    sql_connect();
   
    $sql = mysql_query("SELECT name, password FROM ah_users WHERE name LIKE '%$name%'") or die ("mySQL fejl: " .mysql_error());
   
    while($data = mysql_fetch_array($sql)){
       
        $password = md5($password);
       
        if($name == $data['name'] && $password == $data['password']){
            return TRUE;
        } else {
            return FALSE;
        }
    }
    mysql_close();
}

Jeg kalder funktionen i auth.php således;

if (userLogin($$_POST['user'], $_POST['password']) == TRUE){
    header("Location: http://www.antihelt.dk");

    } else {
    header("Location: http://www.antihelt.dk?error=FALSE");
    }
}

Har prøvet en del, men den retunerer FALSE hver gang.
Avatar billede bromer Nybegynder
28. marts 2005 - 01:06 #1
Okay, den funktion kan man da skrive lidt om. Idet du i PHP undersøger om brugernavnet præcis er det brugernavn du har i databasen kan undlade din LIKE og derudover lave hele checket i PHP. Din kode kan så omskrives til:

function userLogin($name, $password){
    sql_connect();
 
    $sql = mysql_query(sprintf("SELECT COUNT(1) as c FROM ah_users WHERE name = %s AND password = MD5('%s')",$name,$password)) or die ("mySQL fejl: " .mysql_error());
 
    $data = mysql_fetch_array($sql)){ 
   
    mysql_close();
    return ($data['c'] == 1);
}

og så kan du kalde den med:
$loc = (userLogin($$_POST['user'], $_POST['password'])) ? 'http://www.antihelt.dk' : 'http://www.antihelt.dk?error=FALSE';
header("Location: " . $loc);

Det er jo ganske få linier i forhold til det du har lavet og det skulle gerne gøre det samme.
Avatar billede bromer Nybegynder
28. marts 2005 - 01:09 #2
$data = mysql_fetch_array($sql)){

skal selvfølgelig rettes til

$data = mysql_fetch_array($sql);
Avatar billede bromer Nybegynder
28. marts 2005 - 01:14 #3
en forklaring af hvorfor din kode altid retunerer false kan jeg også se nu:

Du beregner følgende linie inde i løkken:

$password = md5($password);

i første iteration af løkken er det også fair nok men derefter beregner du jo md5() af en allerede-beregnet hash. Det vil sige at i iteration 2 vil du sådan set have følgende:

<?
$password = md5(md5('orginalt passowrd'));
?>

og det er helt sikkert ikke hvad du vil. Derfor tror jeg faktisk at din funktion vil retunere true, hvis du fandt den rigtige bruger i første række. Hvis du ikke vil bruge den kode jeg har skrevet til dig kan du rette fejlen ved at flytte beregningen af md5'en ud før løkken:

function userLogin($name, $password){
    sql_connect();
 
    $sql = mysql_query("SELECT name, password FROM ah_users WHERE name LIKE '%$name%'") or die ("mySQL fejl: " .mysql_error());
    $password = md5($password);
    while($data = mysql_fetch_array($sql)){
        if($name == $data['name'] && $password == $data['password']){
            return TRUE;
        } else {
            return FALSE;
        }
    }
    mysql_close();
}

derudover er det ikke rart at se på følgende:

  if($name == $data['name'] && $password == $data['password']){
            return TRUE;
        } else {
            return FALSE;
        }

du skal tænke på at en if er konstrueret som

if (cond) {
exp1;
} else {
exp2;
}

så hvis cond er sand bliver exp1 udført eller bliver exp2. Læg mærke til at hvis din cond er sand så retunerer du i koden sand eller falsk. Så hvorfor ikke bare retunere din cond, så

  if($name == $data['name'] && $password == $data['password']){
            return TRUE;
        } else {
            return FALSE;
        }

kan omskrives til

return ($name == $data['name'] && $password == $data['password']);

og så smider jeg lige et svar :)
Avatar billede bromer Nybegynder
28. marts 2005 - 01:19 #4
jeg ser endnu en fejl: Du har følgende:

if (userLogin($$_POST['user'], $_POST['password']) == TRUE){
    header("Location: http://www.antihelt.dk");

    } else {
    header("Location: http://www.antihelt.dk?error=FALSE");
    }
}

hvor du benytter:
$$_POST['user']

hvilket er lidt fjollet da du sikkert vil bruge $_POST['user'] istedet. Det skal du også have rettet (det fik jeg ikke gjort i første forsøg :)
Avatar billede mysli Nybegynder
28. marts 2005 - 01:31 #5
Bruger nu den her:

function userLogin($name, $password){
        sql_connect();
     
      $password = md5($password);
    $sql = mysql_query(sprintf("SELECT COUNT(1) as c FROM ah_users WHERE name = '%s' AND password = '%s'",$name,$password)) or die ("mySQL fejl: " .mysql_error());
 
    $data = mysql_fetch_array($sql);
   
    mysql_close();
    return ($data['c'] == 1);
}

Var nødt til at sætte md5 konvertionen ud af query'en og sætte %s i '', ellers fik jeg SQL syntax fejl.

Men den vil stadig ikke logge ind. Har lavet et test script, som skriver koden ud i md5() for at se om det matcher det der står i databasen, og det gør det.
Avatar billede mysli Nybegynder
28. marts 2005 - 01:36 #6
Prøver lige at kigge kdoen igennem for fejl igen. Ser ud som om der er flere:)
Avatar billede mysli Nybegynder
28. marts 2005 - 01:39 #7
derudover er det ikke rart at se på følgende:

  if($name == $data['name'] && $password == $data['password']){
            return TRUE;
        } else {
            return FALSE;
        }

du skal tænke på at en if er konstrueret som

if (cond) {
exp1;
} else {
exp2;
}

så hvis cond er sand bliver exp1 udført eller bliver exp2. Læg mærke til at hvis din cond er sand så retunerer du i koden sand eller falsk. Så hvorfor ikke bare retunere din cond, så

  if($name == $data['name'] && $password == $data['password']){
            return TRUE;
        } else {
            return FALSE;
        }

kan omskrives til

return ($name == $data['name'] && $password == $data['password']);


Grunden til jeg har gjrot sådan, er faktisk at der også bliver smidt cookies i den if også
Avatar billede gammelhat Nybegynder
28. marts 2005 - 01:41 #8
Overvej lige denne: $_POST['user']

I formen på antihelt.dk hedder feltet 'name'
Avatar billede mysli Nybegynder
28. marts 2005 - 01:47 #9
Sassafrasser rassin frasser... Næste gang skal jeg huske at opdatere alle filerne>:(!

Mange tak for hjælpen begge to. Gammelhat, er det okay med dig hvis Bromer får pointsne, han har hjulpet en del:)?
Avatar billede gammelhat Nybegynder
28. marts 2005 - 01:57 #10
Jo, det er helt fint
Avatar billede bromer Nybegynder
28. marts 2005 - 02:03 #11
jamen tak for points :)
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