Avatar billede sijmonj Nybegynder
13. maj 2010 - 22:17 Der er 12 kommentarer og
1 løsning

mysqli login system

Hej, jeg er igang med at lave et login system, jeg har valgt at arbejde med mysqli som jeg aldrig har ryddet med før men forstår da lidt af det :).

jeg har valgt at mit script sku laves som OOP mit problem er bare at jeg ved ikke hvordan jeg skal tjekke om brugernavn og password matchede det samme som er i databasen, fordi lige nu binder jeg jo bare det information brugeren har tastet i og så vil han jo altid være logget ind


i kan se min kode her

http://pastebin.com/makaDzz4



lige nu får jeg os den her fejl når jeg trykker login, er der en som kan forklare lidt hvad den betyder :)?


Warning: Missing argument 1 for UserLogin::godkendt(), called in E:\wamp\www\opsatning\top.php on line 13 and defined in E:\wamp\www\classes\UserLogin.php on line 8

Warning: Missing argument 2 for UserLogin::godkendt(), called in E:\wamp\www\opsatning\top.php on line 13 and defined in E:\wamp\www\classes\UserLogin.php on line 8
Du er logget ind



Og her er min kode til top.php

http://pastebin.com/SRAmwh0c


tak på forhånd :)
Avatar billede michael_stim Ekspert
13. maj 2010 - 22:48 #1
echo $ul->godkendt();

Der mangler to stk variabler der skal sendes med ;o)
Avatar billede sijmonj Nybegynder
13. maj 2010 - 22:52 #2
men jeg vil ikke rigtig have at den udskriver det brugernavn og password som brugeren har indtastet :P da det ikke skal bruges til noget andet end at tjekke om der er et match i databasen, derfor godkend har fået de værdi'er
Avatar billede sijmonj Nybegynder
13. maj 2010 - 22:56 #3
ahh fandt ud af at det gør den ikke :P, tror du at du har en løsning til det problem med at tjekke om brugernavn og password er det samme i databasen?
Avatar billede janmanden Nybegynder
13. maj 2010 - 23:44 #4
Jeg er ikke sikker på at jeg helt har fattet problematikken, da svaret virker for simpelt: Hvis din query med brugernavn og password ikke returner mindst en række, så passer brugernavn og password jo ikke, vel?
Avatar billede sijmonj Nybegynder
14. maj 2010 - 11:06 #5
ja jeg synes os det er lidt mærkeligt, men jeg tror det er fordi jeg binder et eller andet :P og så vil der altid være noget altså enten true eller false og jeg tjekker jo bare om der er noget i $stmt variablen og det vil der jo altid være da den enten er false eller true
Avatar billede janmanden Nybegynder
14. maj 2010 - 22:58 #6
Hvis ikke du vil bruge bind_result kan du jo bare bruge store_result i stedet for med en free_result bagefter når du har evalueret data, eller hwa?. Jeg ved ikke rigtig helt hvad ideen er med at have en if-condition på stmt, men det ville da være mest logisk hvis du havde den på fetch, da fetch kun er sand hvis den henter data.
Avatar billede sijmonj Nybegynder
15. maj 2010 - 11:17 #7
hvordan ville det komme til at se ud så :)?.

jeg tænkte bare at når jeg nu skriver

$stmt->fetch();

så når jeg laver en if på $stmt så er den på fetch, men jeg tager fejl :D?.

tror du at du kan lave et lille kode eksempel hvordan du ville tjekke om brugernavn og password matchede det som var i databasen :)?
Avatar billede janmanden Nybegynder
15. maj 2010 - 12:02 #8
Så vidt jeg forstår din kode så er stmt selve objektet og det at lave en if på det svarer egentlig bare til at tjekke om det peger på noget kode eller ej. Altså om det er blevet initialiseret, men hvis ikke den blev det ville den blive fanget af din condition i fjerde linje "or die" istedet for.

Så min ændring af din kode ville egentlig bare se sådan her ud:

function godkendt($p_username, $p_password) {
        $mysql = connect();
        $stmt = $mysql->prepare("SELECT username, password FROM users WHERE username = ? AND password = ?") or die(mysql_error());
        $stmt->bind_param("ss", $p_username, $p_password);
        $stmt->execute();
        $stmt->bind_result($col_username,$col_password);
        $response = "Der var fejl i dit brugernavn eller password";
        if ($stmt->fetch())
            if ($col_username == $p_username && $col_password == $p_password && true)
                $response =  "Du er logget ind";
        }
        return $response;
    }

Det er da ved at være noget tid siden at jeg har lavet php i hånden og jeg hader det i forvejen, hehe. Jeg har flyttet lidt rundt på nogle ting. Og den ekstra if er sådan se bare for en ordens skyld og den er sikkert ikke nødvenidg. Jeg har ændret lidt på variabel navne for jeg ved ikke hvad du ellers bruger af indstillinger.
Avatar billede sijmonj Nybegynder
15. maj 2010 - 12:30 #9
ahh smart måde :), men hvad gør

if ($stmt->fetch())

den tjekker bare om der er noget?


tusind tak for hjælpen ihvertfald, nu kan jeg komme lidt videre med mit projekt :)
Avatar billede janmanden Nybegynder
15. maj 2010 - 13:47 #10
fetch Return Values
TRUE Success. Data has been fetched
FALSE Error occurred
NULL No more rows/data exists or data truncation occurred

Tjek på fetch bruges også ofte når man looper recordsets med while. Den henter bare resultatet, altså næste row.

while ($stmt->fetch()) {
/* udfør noget */
}

Nå ja for en god ordens skyld skal du jo også lige huske at lukke for det varme vand:

$stmt->close();
$mysql->close();
Avatar billede sijmonj Nybegynder
16. maj 2010 - 13:57 #11
jeg har 2 filer

top.php hvor <head> osv. er i

så har jeg bund.php hvor jeg så lukker de fleste tags

kunne jeg ikke nederst i bund.php skrive

$stmt->close();
$mysql->close();

jeg har os rettet lidt så den selecter lidt flere ting fra databasen men så får jeg den her fejl :S

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement in E:\wamp\www\classes\UserLogin.php on line 12

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement in E:\wamp\www\classes\UserLogin.php on line 12

du kan se hvad jeg har lavet om i det link længere nede

lige nu har jeg et andet problem du måske os kan hjælpe mig med :).

jeg skal indsætte noget data i en tabel men det gider den ikke helt, det ligesom om at den ikke "sender" informationen fra min ene fil over i min anden


createUser.php

http://pastebin.com/kfUkuMC8

og så der UserLogin.php som skal indeholde alt hvad der har med bruger login,tjek,glemt kode, opret osv. :)

http://pastebin.com/W15Ue2qa

har søgt google tynd og været inde på php.net og kigge os men kan slet ikke finde ud af hvorfor den ikke gider indsætte


Tusind tak for hjælpen ihvertfald :)
Avatar billede janmanden Nybegynder
17. maj 2010 - 20:12 #12
Hvis du er tilfreds med mit svar til dit oprindelige problem så afslut venligst denne tråd, uddel point og start en ny, herefter.

Bare lige så du forstår sammenhængen. Linje 1 og 2 er ikke relaterede.

1. Denne linje referer til ? i din where statement.
$stmt->bind_param("ss", $p_username, $p_password);

2. Denne linje binder valgte felter i select til variabler.
$stmt->bind_result($col_username,$col_password)

Hvis du har tilføjet flere felter til select, skal du jo huske at binde_result dem også.

$stmt->bind_result($col_username,$col_password, $col_felt2, ...)

SELECT username, password, felt2, ..
FROM users
WHERE username = ? AND password = ?

I din insert mangler du at angive i hvilke felter værdierne skal sættes ind:

Så din SQL sætning:  'INSERT INTO users VALUES (NULL,?,?)' skal istedet se sådan her ud: 'INSERT INTO users (username,password) VALUES (?,?)'

Jeg ved ikke lige hvad din NULL værdi skal betyde, men du har vel et autonummeret felt? Kan ikke lige huske om man kan skal skrive det i mysql, men normalt skal ikke have det med i en insert.
Avatar billede sijmonj Nybegynder
17. maj 2010 - 21:49 #13
jeg er meget tilfreds med dine svar :) har lært RIGTIG meget :D tusind tak du får lige point
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