Søger du en specifik kategori?

 



Oprettet man. d. 02. februar 2009 kl. 22:22

wicez (nedlagt brugerprofil)
Guidens karaktér
1
2
3
4
5

Loginsystem (med MySQL)

Dette er en guide til, hvordan man kan lave et loginsystem med php og muligvis også med sessioner og MySQL
Loginsystem med php (og mysql)

Denne guide henvender sig til personer der har en mindre eller større forståelse for PHP og den basale syntaks heri.
Det er en fordel at kende en smule til MySQL hvis man vælger at følge hele denne guide.
Dette er dog ikke en nødvendighed for at forstå det grundlæggende omkring opbygningen af et simpelt loginsystem i PHP.

Vi vil starte med at opbygge formularen i en ny html side. Heri behøver vi ikke noget php:

formular.htm



<html>
<head>
<title>Min loginformular</title>
</head>
<body>
<form name="min form" id="min form" method="post" action="check.php">
Brugernavn: <input type="text" name="brugernavn"><br>
Kodeord: <input type="password" name="kodeord">
<input type="submit" name="login" value="Login">
</form>
</body>
</html>



Vi vil ikke kigge nærmere på formularen, da vi primært vil koncentrere os om server-side delen.


check.php

Den næste side vi skal have oprettet hedder check.php. Dette er den første php side vi skal have kodet lidt på. Så det er bare om at få smøget ærmerne op.
Vi starter med koden:



<?php
//Vi starter med at defindere variabler, så det bliver nemmere at tilkomme dem senere.
$brugernavn = $_POST['brugernavn'];
$kodeord = $_POST['kodeord'];

//Tjekker om både brugernavn og kodeord er indtastet.
if(empty($brugernavn) || empty($kodeord))
    {
    //Sender brugeren tilbage til formular.htm ved brug af en header
    header("location. formular.htm");
    exit;
    }
//Hvis både brugernavn og kodeord er sat går vi videre.
else
    {
    //Definerer det rigtige kodeord og det rigtige brugernavn.
    //Vi vil senere gå videre ind i dette,
    //og se på hvordan vi kan implementere MySQL ind i vores script
    $rigtigt_brugernavn = 'Jens';
    $rigtig_kode = 'hallo';
   
    //Tjekker om $brugernavn er lig med det rigtige brugernavn, og om $kodeord er lig med det rigtige kodeord
    if($brugernavn == $rigtige_brugernavn && $kodeord == $rigtige_kode)
        {
        //Brugeren har indtastet det rigtige brugernavn og kodeord.
        echo "Tillykke, du er nu logget ind.";
        /*
        Det er normalt her man inkluderer filer man ikke må se, hvis man ikke er logget ind.
        Her er det også muligt at gemme brugerens kodeord i sessioner,
        så brugeren også er logget ind når han navigerer rundt på din hjemmeside.
        */
        }
    else
        {
        //Skriver til brugeren at han har fået forkert brugernavn
        echo "Det indtastede brugernavn og/eller kodeord var forkert";
        echo "<br><br>";
        //Laver et link som brugeren kan trykke på, for at komme tilbage til formular.htm
        echo "Tryk <a href=\"formular.htm\">her</a> for at komme tilbage";
        }
    }

?>



Dette var et meget simpelt eksempel på et loginsystem lavet i php, uden brug af hverken mysql eller sessioner.
Jeg vil hermed afslutte det helt simple, og begynde at forklare om hvordan MySQL virker sammen med php, og hvordan de grundlæggende funktioner virker.


MySQL

For at starte fra en begyndelse, er MySQL en database. Der findes utrolig mange forskellige databaser, og jeg vil ikke begynde at bedømme hvilke der er bedst - i hvert fald ikke i denne guide.
Det grundlæggende i en MySQL database er tabeller. Det første man definerer, er de forskellige kolonners navne. En brugertabel som vi kunne få brug for kunne f.eks. se sådan ud:


id - brugernavn - kodeord


Hvis du bruger phpmyadmin til din database, skal deres attributter se ud som dette:


id:  int, auto_increasement, primary
brugernavn:  varchar(255)
kodeord: varchar(255)


Id'et er ikke nødvendigt, det er kun lavet for at kunne identificere hver bruger, idet flere brugere måske har samme brugernavn.

For at forbinde til en MySQL database med php, skal du bruge funktionen mysql_connect().
Denne funktion har følgende parametre:

Server, Brugernavn, Kodeord.

Hvis du selv hoster din webserver har du selv defineret brugernavn og kodeord, mens serveren vil være "localhost". Hvis du bruger en anden webserver har du sandsynligvis modtaget en e-mail med disse oplysninger.

En anden funktion du skal bruge er funktionen mysql_select_db() der har følgende parametre:


Databasenavn
Databaseforbindelse


De fleste har kun én database. Navnet på denne database skal du skrive som første parameter, mens der som "databaseforbindelse" skal bruges funktionen mysql_connect().
I dette tilfælde vil det være smart at lave en kode som denne, når du skal forbinde til den database:



<?php
$link = mysql_connect("server", "brugernavn", "kodeord");
mysql_select_db("databasenavn", $link);
?>



Når denne kode er skrevet, vil du have adgang til databasen fra dit php-script.
Der er én funktion mere vi skal kigge på, før vi kan bygge videre på vores login-script. Denne funktion hedder mysql_query() (og mysql_fetch_assoc()) denne funktion bruges til at lave et kald til databasen, så det er muligt at trække data ud fra din database. Til dette skal bruges et andet scriptsprog der hedder SQL. Hvis du ikke kan dette "sprog" kan du bare skrive præcis det jeg skriver, selvom det måske er lidt indlysende hvad jeg skriver, idet det meste er almindelig engelsk.
mysql_fetch_assoc() bruges til at lægge det data du får fra din mysql_query, ind i et array i php. Der findes flere lignede funktioner som mysql_fetch_object og mysql_fetch_row. Disse har jeg dog valgt at udelade fra denne guide.
En anden funktion vi får brug for er funktionen mysql_num_rows(). Denne funktion skal også bruge en mysql_query for at fungere. Mysql_num_rows() returnerer antallet af rækker der matcher den valgte query.

Sessioner
Sessioner er det vi skal bruge, hvis vi gerne vil gemme oplysninger fra den ene af vores sider, til andre sider. Disse sessioner er gemt i browseren, og er en slags alternativ til cookies, selvom de langt fra gør det samme.
For at fortælle browseren at "Vi skal til at bruge session" skal vi bruge funktionen session_start(). Denne funktion skal skriver øverst på enhver side, hvorpå du vil bruge sessioner. Der må ikke komme noget output til browseren før denne funktion, ikke engang <html>.
Sessions_variabler bliver gemt i arrayet (listen) $_SESSION['navnet']og kan meget nemt tilgås ved rigtig brug af dette array.



Implementering af MySQL og sessioner i check.php

Jeg går her ud fra, at du har en tabel der hedder "brugere" med kolonner som jeg skrev ovenfor

check.php



<?php
//Helt i starten starter vi sessioner, og forbinder til vores database
session_start();
$link = mysql_connect("server", "brugernavn", "kodeord");
mysql_select_db("databasenavn", $link);

//Tjekker om både brugernavn og kodeord er indtastet.
if(empty($_POST['brugernavn']) || empty($_POST['kodeord']))
    {
    //Sender brugeren tilbage til formular.htm ved brug af en header
    header("location. formular.htm");
    exit;
    }
//Hvis både brugernavn og kodeord er sat, går vi videre.
else
    {
    /*
    Her bruger vi databasen for første gang, idet vi nu tjekker om der er
    en bruger der har det brugernavn, der er indtasetet i formularen.
    Vi bruger or die(mysql_error()) til at få mysql til at udskrive en fejl,
    hvis der er noget galt med databasekaldet.
    */
    $query = mysql_query("SELECT * FROM brugere WHERE brugernavn='". $_POST['brugernavn'] ."'") or die(mysql_error());
    //Tjekker om der er én rækker i databasen der har det indtasetde brugernavn
    //Dette gør dog, at flere brugere ikke må have samme brugernavn!
    if(mysql_num_rows($query) == '1'))
        {
        //Laver databasekaldet om til en liset (et array) i php.
        $row = mysql_fetch_array($query);
        //Tjekker om kodeordet i databasen er lig med det indtastede kodeord
        if($row['kodeord'] == $_POST['kodeord'])
            {
            //Brugeren har indtastet rigtige oplysninger, nu skal han gemmes i sessioner
            $_SESSION['brugernavn'] = $_POST['brugernavn'];
            //Derudover skal han sendes til en hemlig side, hvorpå der bliver tjekket om han er logget ind
            header("location: hemligside.php");
            }
        else
            {
            //Brugeren har skrevet et forkert kodeord
            //Sender brugeren tilbage til formular.htm ved brug af en header
            header("location. formular.htm");
            exit;
            }
        }
    //Brugernavnet fandtes ikke i databasen, derfor skal der udskrives en fejl.
    else
        {
        //Brugeren har skrevet et forkert brugernavn
        //Sender brugeren tilbage til formular.htm ved brug af en header
        header("location. formular.htm");
        exit;
        }
    }

?>




For at tjekke om det virkede, kan vi lave hemligside.php sådan her:

Hemligside.php



<?
//Starter endnu engang sessionerne øverst på siden, samt forbinder til databasen
session_start();
$link = mysql_connect("server", "brugernavn", "kodeord");
mysql_select_db("databasenavn", $link);

//Tjekker om man er logget ind
if(!empty($_SESSION['brugernavn']))
    {
    //Laver en query der finder ens brugerid i databasen
    $query = mysql_query("SELECT * FROM brugere WHERE brugernavn='". $_SESSION['brugernavn'] ."'") or die(mysql_error());
    $row = mysql_fetch_assoc($query);
    //Man er logget ind, og kan derfor se det hemlige indhold
    echo "Dit brugerid er: ". $row['id'];
    }
else
    {
    //Brugeren er ikke logget ind
    echo "Du er ikke logget ind. Du skal ikke prøve at snyde på min hjemmeside!";
    }

?>



Alle 3 filer skal ligge i samme mappe på din server for at scriptet skal fungerer.

Jeg håber i kunne bruge denne guide til noget. Den er, som nævnt i starten, ment til nybegyndere indenfor php, der er kendte med den basale syntaks heri.
Hvis i har spørgsmål e.l. kan i sende mig en e-mail på abb@cykeltjek.dk eller prøve at fange mig herinde på exp.dk

Jeg har ændret nogle småting i dag, da jeg har fået at vide at det er en dårlig måde at gøre det på :o) (13/4-2005).

Edit: Jeg havde glemt en<input type="submit"> i starten af artiklen. Tak venchil

Edit: Jeg har gjort artiklen gratis, selvom jeg nu ikke kan se hvor mange der har læst den :|
Hvis i vil skrive en kommentar vil jeg gerne have at i husker, at artiklen er ment til nybegyndere, og at forskellige regular expressions er udeladte.

- Anders Balmer

Skrevet man. d. 11. april 2005 kl. 13:17| #1

hyberpreprocessor (14.004 point)
god guide, du burde nok lave noget input validering før du henter info i databasen, bare addslashes() rigeligt, men en simpel reg.exp ville også være godt (hov, havde lige overset sidste linje hehe) :)

Skrevet man. d. 11. april 2005 kl. 18:30| #2

cypermann (30.027 point)
En fin artile. Men er det ikke overkill at lave et sql udtræk hver gang en side loader, for at se om brugeren er logget ind. Nu du alligevel har sat en session. God begynder guide, men meget kunne optimeres.

Skrevet man. d. 11. april 2005 kl. 23:55| #3

wickedd (15.942 point)
Tja .. Ikke en særlig god måde at gøre det på

Skrevet ons. d. 13. april 2005 kl. 21:08| #4

Jeg havde nu:
$query = mysql_query("SELECT * FROM brugere WHERE brugernavn='". $_POST['brugernavn'] ."' AND kodeord='". $_POST['kodeord'] ."'") or die(mysql_error());

Det kan den lige så godt, og så tjekke om der findes nogen bruger med det indtastede...

Skrevet søn. d. 17. april 2005 kl. 13:55| #5

venchil (12.740 point)
Det er en utrolig god artikel, som jeg kunne bruge til utrolig meget. Men mangler der ikke en "login"-button, som man kan trykke på i det første stykke kode?

Skrevet tor. d. 28. april 2005 kl. 12:15| #6

klubba (12.975 point)
Super artikel!

Skrevet fre. d. 27. maj 2005 kl. 12:37| #7

philip (21.269 point)
kluntet kode, kluntet metode :)

Skrevet søn. d. 05. juni 2005 kl. 13:06| #8

mccookie (25.472 point)
Der er formodentligt væsentligt smartere måder at gøre det på.....
Der er noget med at man kan lave nogle bandittricks med dine forespørgelser i forhold til at du ikke kontrollere hvad bruger indtaster af brugernavn.....

Skrevet tir. d. 28. juni 2005 kl. 17:53| #9

arkanoid (14.810 point)
Tja.... en lidt kompliceret/usmart metode... og desuden bør sessioner krypteres

Skrevet søn. d. 12. marts 2006 kl. 19:28| #10


Skrevet fre. d. 07. april 2006 kl. 20:04| #11

pvtsommer (11.455 point)
Jeg mener ikke denne er god for begyndere. De skal ikke lære at det er så kluntet at man på alle sider skal have 50 linjers kode, som egentlig ikke har noget med indholdet at gøre. ;) - Men koden er da velskrevet i bund og grund, så du får middel.

Skrevet søn. d. 24. september 2006 kl. 16:44| #12


Skrevet søn. d. 07. januar 2007 kl. 18:46| #13

lassemelbye (10.080 point)
God artikel, som er værd at læse hvis man skal lave et loginsystem.
Synes godt du kunne have lavet nogle indrykninger i dine eksempler, men godt at du har fået massere at kommentarer på

Skrevet lør. d. 19. januar 2008 kl. 23:41| #14

john_stigers (194.195 point)
Windows 7 32 bit
Kunne ikke bruge det til noget - ikke forklaret særligt godt.
Desuden er det vist en guide og ikke en artikel...

Skrevet søn. d. 10. august 2008 kl. 16:06| #15

hvorfor er der 2 forskelige check.php´er

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
12 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger