Fra begynder til login

Tags:    php
<< < 12 > >>
Skrevet af Bruger #15344 @ 14.01.2010

Indholdsfortegnelse


  • Indledning

  • Formål

  • Forudsætninger

  • Sådan læses guiden

  • Grundlæggende viden

  • Opret en bruger

    • MySQL tabel

    • HTML-del

    • Bruger-input

    • Indsæt i database

  • Login

    • HTML-delen

    • PHP-del

    • Sessions

  • Beskyttede sider

  • Opsamling

  • Afsluttende kommentar



Indledning


Inden for den seneste tid er jeg flere gange blevet kontaktet i forbindelse med spørgsmål omkring PHP af helt nybegyndere. "Kender du ikke en god guide?" - og til det har jeg desværre måtte svare nej, da jeg ikke synes at have fundet noget jeg helt kunne stå inde for var en god guide. Derfor har jeg nu besluttet at gøre mit eget forsøg på en god guide til helt nybegyndere inden for PHP.

Formål
Formålet med denne guide eller tutorial, er at komme fra ingen viden til et simpelt login-system med anvendelse af PHP og en MySQL-database.

Forudsætninger
Hvad kræver denne guide for at kunne bruges til noget?
Først og fremmest er det nødvendigt at kende en smule til hjemmesider i forvejen. Grundlæggende html er et minimum, men det er en fordel at have prøvet lidt med html, css og evt. javascript. Kan man ikke html findes der en glimrende guide på HTML.dk.
For at kunne vise PHP skal man bruge en server med PHP installeret. Man kan installere det på sin egen computer (for Windowsbrugere: enten med IIS, Windows indbyggede server, eller en Apache-installation, her kan WAMP anbefales) eller man kan bruge et webhotel. Langt de fleste webhoteller understøtter i dag PHP.
Desuden skal webhotel eller egen webserver have adgang til en MySQL-database.
Derudover skal man bruge en tekst-editor til at redigere .php-filerne. Der findes et hav af gratis-editorer (PSPad har jeg selv brugt førhen) som hjælper dig med at farve din kode så den er lettere at overskue.

Sådan læses guiden
En kode-stump efterfølges altid af et forklarende tekst-afsnit hvor hver enkelt ny funktion vil blive gennemgået.
PHP-funktioner markeres med kursiv i den almindelige tekst.

Grundlæggende viden


For at arbejde med PHP har vi brug for lidt grundlæggende viden. Resten vil jeg forklare løbende som jeg bruger funktionerne i koden. Har du set en smule på PHP før kan du let springe dette afsnit over.
En PHP-fil har som regel endelsen .php.

hello.php
Fold kodeboks ind/udPHP kode 


Sådan kunne et php-dokument se ud. PHP er et server-side-sprog, det er altså serveren der læser PHP-koden, mens html, css, javascript og lign. er klient-side-sprog, det er altså din browser der læser html/css/javascript. Du kan frit blande php og klient-side-sprog i dine .php-filer. Men al din php-kode skal være inden for <? og ?>.
Funktionen echo bruges til at udskrive tekst til skærmen. Du kan skrive html-tags med echo.
Alle linjer i PHP afsluttes med ; (semikolon).

variabel.php
Fold kodeboks ind/udPHP kode 


Her bruger vi en variabel til at skrive "verden". echo bruges igen til at udskrive til skærmen. Tekst og variabler sammensættes med et . (punktum).

Nu er det jo ikke god kotume ikke at have <html>, <head> og <body> så vi ser lige hvordan en standard .php-fil kunne se ud:

standard.php
Fold kodeboks ind/udPHP kode 


Her kombineres html og PHP i samme fil. Du kan starte og slutte PHP-afsnit flere gange i samme fil hvis du har lyst.

Opret en bruger


MySQL-tabel
Som det første før man kan logge ind i et system er man nødt til at have oprettet en bruger. Så først vil vi se på hvordan vi får oprettet en bruger i en MySQL-tabel.
Allerførst må vi have en simpel forståelse for hvordan en MySQL-database er skruet sammen.
Databasen består af tabeller og tabeller består af rækker og kolonner. Kolonnerne defineres når du opretter tabellen. De fleste steder der understøtter MySQL har ligeledes installeret phpMyAdmin, som er en brugervenlig måde at håndtere dine databaser og tabeller på.

Vi opretter først en tabel til vores brugere. Denne tabel kalder vi simpelt nok "brugere". Den skal indeholde følgende 3 kolonner (felter):
"id" af typen INT, under ekstra vælges "auto_increment" og der sættes et hak ved den lille firkant med nøglen (Primær).
"brugernavn" af typen VARCHAR og længden 255
"password" af typen VARCHAR og længden 255

Følgende SQL-kode kan også bruges til at oprette tabellen (dette gøres i phpMyAdmin under fanen SQL):

Fold kodeboks ind/udSQL kode 


HTML-delen
At bede brugeren indtaste de oplysninger der skal bruges til at logge ind med er ganske simpel html og kunne se sådan her ud:

opret.php
Fold kodeboks ind/udHTML kode 


Det første man skal lægge mærke til er "action" her defineres den adresse man kommer hen til når man klikker på "Opret"-knappen. "method=post" definerer måden hvorpå de indtastede data sendes videre til serveren, det kommer vi til at se nærmere på om lidt.
Vi beder brugeren gentage sit password, for at sikre os mod stavefejl.
Hvert "input"-felt har en type og et navn. Typen "password" sørger for at feltet kun viser stjerner når man indtaster noget i det. "name=" angiver hvordan vi vil finde det indhold der er i netop dét felt med PHP på den næste side.

Bruger input
Den næste side bruges til at fange de indtastede data fra oprettelsesformen og indsætte dem i den tabel vi har oprettet til det. Først skal vi have indsamlet de data brugeren skrev i html-formen og sørge for at de data der er
indtastet kan bruges.

indsaet.php
Fold kodeboks ind/udPHP kode 


Det første vi lægger mærke til her, er en ny type variabel-navn. $_POST["navn"] er en global variabel. $_POST variablen indeholder alt data sendt fra en html-form med "method=post". Den måde man finder de rigtige data på er klammerne bagefter. Husker vi på html-delen havde hvert felt en "name="-attribut. Det der står efter lighedstegnet er det vi skal have ind i vores [""]-klammer.
$_POST["brugernavn"] indeholder altså det brugeren har indtastet i "brugernavn"-inputfeltet.

Herefter vil vi gerne sikre os at der er indtastet noget i felterne. Dette gøres med PHP-funktionen if. Betydningen af ordet forklarer langt hen ad vejen hvad funktionen gør. Denne funktion spørger altså "hvis". Parentesen efter if giver en betingelse som skal være opfyldt for at det der står indenfor { og } udføres.
Her spørger vi if indholdet i brugernavn == (indeholder) "", altså ingenting, så udskriver vi en fejl på skærmen. Desuden udføres kommandoen $errorCount++;.
Programmører er per definition dovne ovenstående kommando svarer altså til at skrive $errorCount = $errorCount+1;, det fylder bare ikke helt så meget.
Da vi startede med en $errorCount på 0, har vi altså nu 1, hvis der ikke blev skrevet noget i brugernavns-feltet. Det kan vi bruge senere til at se om der er nogen fejl.
Det samme tjekkes for password-feltet. if-sætningen er lidt anderledes end de andre to.
De to || angiver at enten skal det der står på den ene side være opfyldt, ellers skal det der står på den anden side være opfyldt. Her tjekker vi altså om $gentag er tom, eller != (forskellig fra) $password. Hvis en af de to ting er opfyldt udskriver vi en fejl og tæller op på fejltælleren. I stedet for || kan man bruge && så skal begge betingelser være opfyldt.




<< < 12 > >>

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (30)

User
Bruger #14700 @ 14.01.10 14:10
Jeg har lige en hurtig kommentar.

Jeg kan se at du bruger md5 som faktisk kan knækkes ret nemt.
Burde man ikke bruge sha1 for at få en god sikkerhed?
User
Bruger #8223 @ 14.01.10 14:47
Velformuleret og velstruktureret. Et godt, hurtigt, simpelt og lige til stykke tekst at smide i hovedet på PHP-begyndere.

Lige et par forslag til forbedringer med på vejen:
Du bruger åbningstagget <? i de fleste af dine filer. Det er efterhånden blevet en meget udbredt best practice altid at bruge åbningstagget <?php istedet, da det er mere generisk - mange hostingfirmaer har deaktiveret shorttags, så det smarteste er at vænne sig til at bruge <?php - hvis ikke for din egen, så for folk du eventuelt på et tidspunkt deler noget kode meds skyld.

Du er heller ikke altid helt konsistent med dine if-sætninger. Folk med en smule hår på brystet hvad angår kodning kan sagtens identificere varierende if-sætninger og hvorfor det er bedre at bruge den ene frem for den anden, men en nybegynder, som er artiklens målgruppe, bliver som regel forvirret hvis en if/else både skrives som:
Fold kodeboks ind/udKode 

og
Fold kodeboks ind/udKode 

i den samme artikel.
User
Bruger #15624 @ 21.01.10 22:41
Fin nok artikel, men der er dog et enkelt sted, hvor der kan ende med at dukke en sikkerhedsfejl op.

Ved $bruger tilføjer du ikke selv nogen backslashes (\), og selvom den normalt tilføjer dette af sig selv, er det muligt at slå det fra, hvilket betyder at ikke alle servere nødvendigvis sørger for det selv. Hvis serveren ikke gør dette, vil jeg bare kune skrive a' OR '1' = '1 eller noget værre endnu, og vupti, jeg er logget ind på siden.
User
Bruger #15344 @ 25.01.10 20:21
Tak for feedbacken. Regner med at tilføje opdateringer til guiden når jeg får tid :)

Kan godt se problemet med sql-injections, jeg overvejede også at medtage det. Det største problem her er at artiklen er for absolut begyndere, så jeg vil også helst begrænse den, så det ikke bliver for meget på en gang. Det kan være jeg skal skrive lidt om sikkerhed i min afslutning, så man selv kan læse videre og forbedre det :).
User
Bruger #15665 @ 02.02.10 20:50
Hej
Jeg er ny, og har "leget" lidt med din artikel.
Den er fin og nem at forstå. Men ...
Jeg har ledt rundt på nettet, men kan ikke helt finde ud af hvorfor jeg får denne fejlkode:

Warning: Cannot modify header information - headers already sent by (output started at /customers/xxxx.dk/xxxx.dk/httpd.www/Test/login.php:1) in /customers/xxxx.dk/xxxx.dk/httpd.www/Test/login.php on line 35

Hvad her jeg gjort forkert ?
User
Bruger #2330 @ 03.02.10 07:38
Flemming, prøv at tjekke om du eventuelt har mellemrum, linjeskift eller lignende før den første <?php ... ?> blok. Ethvert tegn foran her vil betyde udskrift til browseren, og derved give den fejl du omtaler.
User
Bruger #15665 @ 03.02.10 21:08
Jep korrekt. Tak
User
Bruger #15621 @ 08.02.10 01:20
Jeg får følgende fejlmeddelelser ved login.php til user.php:


Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /data/cluster/free1go/d/o/www.donl.1go.dk/brugersystem1/user.php:1) in /data/cluster/free1go/d/o/www.donl.1go.dk/brugersystem1/user.php on line 2

Warning: mysql_query(): Access denied for user 'root'@'localhost' (using password: NO) in /data/cluster/free1go/d/o/www.donl.1go.dk/brugersystem1/user.php on line 6

Warning: mysql_query(): A link to the server could not be established in /data/cluster/free1go/d/o/www.donl.1go.dk/brugersystem1/user.php on line 6

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /data/cluster/free1go/d/o/www.donl.1go.dk/brugersystem1/user.php on line 7




Hvad kan der være gået galt?
User
Bruger #15344 @ 08.02.10 17:24
Mads VL - som Flemming også fik at vide så har du muligvis er mellemrum eller lign. foran dit <?. Den siger i hvert fald at den ikke kan sende headeren i linje 2, fordi der allerede er udskrevet noget til browseren i linje 1.

Den næste fejl skyldes en fejl idet du forsøger at connecte til databasen. Den vil ikke give dig adgang. Formentlig er dette fordi du har skrevet et forkert host/brugernavn/password i
Fold kodeboks ind/udKode 


De sidste to fejl går væk når du får kontakt til databasen :)
User
Bruger #15621 @ 08.02.10 21:52
Okay har rettet det som du sagde, men for nu kun disse fejlmeddelser når jeg prøver at logge brugeren ind:

Fold kodeboks ind/udKode 



Man kan sagtens oprette sig i databasen, men når man logger ind får man ovenstående.. Den siger også kun "Hej !" i stedet for "Hej (brugernavn)!"

adressen er http://donl.1go.dk/brugersystem1/index.htm hvis det er til nogen hjælp
User
Bruger #15621 @ 08.02.10 22:27
Okay har rettet det som du sagde, men for nu kun disse fejlmeddelser når jeg prøver at logge brugeren ind:

Fold kodeboks ind/udKode 



Man kan sagtens oprette sig i databasen, men når man logger ind får man ovenstående.. Den siger også kun "Hej !" i stedet for "Hej (brugernavn)!"

adressen er http://donl.1go.dk/brugersystem1/index.htm hvis det er til nogen hjælp
User
Bruger #15621 @ 08.02.10 22:27
Okay har rettet det som du sagde, men for nu kun disse fejlmeddelser når jeg prøver at logge brugeren ind:

Fold kodeboks ind/udKode 



Man kan sagtens oprette sig i databasen, men når man logger ind får man ovenstående.. Den siger også kun "Hej !" i stedet for "Hej (brugernavn)!"

adressen er http://donl.1go.dk/brugersystem1/index.htm hvis det er til nogen hjælp
User
Bruger #15344 @ 09.02.10 08:23
Ah... Kan godt se jeg har lavet en fejl :) my bad..

På din beskyttede side (user.php) skal du naturligvis også connecte til databasen ligesom på siden login.php.

Tilføj disse to linjer efter din session_start(); i user.php. Husk naturligvis at rette host/brugernavn/password/database til dine egne værdier.

Fold kodeboks ind/udKode 
User
Bruger #15621 @ 09.02.10 17:16
Det giver god mening i hvert fald.. det vil jeg gøre :)

tak for hjælpen !
User
Bruger #15783 @ 25.03.10 10:21
Dejlig guide og glæder mig til at hoppe over den, men eftersom du efterspørger rettelser så ville jeg lige tilføje at der er lidt fejl i din tekst i det sidste kode eksempel:

"Velkommen til simple dette login-system"

hvor der lige skal byttes rundt på to ord ;)

Men ellers rigtig god guide, der helt får mig til at ville prøve at programmere i php igen.
User
Bruger #5339 @ 18.06.10 11:17
Hey, super artikel, tusind tak!!

Et spørgsmål, jeg kan ikke få min login.php til at redirecte til user.php, efter jeg logger ind bliver den bare på login.php og der er intet på siden... - jeg ved ikke hvorfor!

Jeg har stort set bare kopieret alle koder fra din artikel, men det virker stadig ikke - nogle idéer til hvorfor dette kunne være??

Nicholas
User
Bruger #15987 @ 05.07.10 18:54
Hej .. (:
Jeg har længe forsøgt at lære PHP, men der findes absolut ingen brugbare guides til nybegyndere. I hvert fald ikke til mig.
Så, nu håbede jeg lige, da jeg så din artikel. Især fordi jeg netop står og skal bruge et loginsystem.
Men, selvfølgelig. Jeg kommer til det sted der omhandler MySQL - og pludselig skal man lave nogle kolonner og nogle rækker, og sætte hak i ting og sager? Jeg fatter absolut ingenting. Hvad snakker du om? Kan jeg få lidt hjælp her? .. :D
User
Bruger #16043 @ 08.08.10 17:23
Det her er en rigtig god guide, og nok den bedste jeg har set længe. Jeg er selv forholdsvis ny til PHP bortset fra, at jeg efterhånden kan lave "kontaktforme". Jeg lånte derfor bogen "Start på PHP5", som giver en udmærket forståelse af, hvordan det hele fungerer. Og der er også et afsnit omkring MySql. Problemet med bogen er bare, at den ikke altid, specielt til sidst, bruger nogle særlig gode metoder. Der bliver brugt 10x så meget kode, som her. Efter jeg er blevet færdig med bogen, læste jeg denne artikel, og den er rigtig god - med lidt tilføjelser som "addslashes", for sikkerhedens skyld, vil jeg nok fremover bruge dette som grundform for mine login-systemer. Men hvis en af jer kloge hoveder, vil præcisere hvad "MD5" helt præcist gør, vil jeg blive glad - og nu snakkede Brun0 om noget med sha1?

Thumbs up to the auother!

Mvh.
Christian Bundgaard / Dev

PS: Ida, gå ind på phpmyadmin - som du højst sandsynligt har adgang til, hvis du har et webhotel - og gå ind på din database. Der er en fane, der hedder SQL, og der indsætter du bare koden og trykker OK/Go 1-2 gange.
User
Bruger #14510 @ 08.08.10 19:11
super tutorial :D har slev afprøvet den og virker glimrende,
ville dog bruge sha1 istedet som BrunO også siger :)
5/5
User
Bruger #16043 @ 08.08.10 21:14
Har nu prøvet at eksperimentere med det, men det virker ikke for mig. Det er nok en eller anden dum fejl, men hvis der er en, der kan finde den, vil jeg blive glad :) Når jeg opretter en bruger, kommer den til en tom side.

Her er koderne - først opret.htm og dernæst indsaet.php

Fold kodeboks ind/udKode 


Fold kodeboks ind/udKode 


Jeg bliver MEGET glad, hvis der er en der kan løse det, da det er mit første loginsystem, og jeg vil rigtig gerne lære det ;)

Mvh.
Christian
User
Bruger #16043 @ 10.08.10 17:45
Problem løst. Der var glemt en "}" til sidst ^^
User
Bruger #16016 @ 05.09.10 20:11
Hey!

Det er en super artikel, og det virker super, men der er dog ét problem, og det er at man kan oprette den samme bruger 2 eller flere gange med samme brugernavn o_o Hvordan forhindre jeg det? Læg venligst en/et kode/script til dette :)
User
Bruger #16342 @ 06.01.11 14:31
Hej, det er en rigtig god artikel, dog forvirrende det med at du ikke kalde fil navnene det samme i alle koderne, men skidt pyt da det jo er til at forstå.

Men jeg er løbet ind i samme problem som Nicholas Bendt.
Det er somom at den glemmer at jeg er logget ind når går hen på en ny side altså user.php
User
Bruger #15344 @ 11.01.11 09:52
Hej Anton

For at sørge for at man ikke kan oprette to brugere med samme brugernavn tilføjer du følgende kode på linjerne mellem mysql_select_db() og if($errorCount == 0):

Fold kodeboks ind/udKode 


Det koden gør er at lede efter en bruger med det valgte brugernavn i databasen. mysql_num_rows tæller hvor mange rækker en mysql_query har fundet. Hvis den finder nogen rækker med det brugernavn, så er brugernavnet optaget og den udskriver en fejl.
User
Bruger #15344 @ 11.01.11 09:53
Bemærk at ovenstående skal indsættes i indsaet.php. Fik jeg ikke lige skrevet.

Og tak for rosen til alle jer andre.
User
Bruger #5620 @ 03.02.11 17:35
I stedet for at gøre som Randi H. foreslår, hvad så med at gøre kombinationen af brugernavn og koderord unik i tabellen.

Test om indsættelse forårsager fejlen, der returneres ved forsøg på oprettelse af en række med et gentaget unikt index.



User
Bruger #16705 @ 13.07.11 22:47
Hey, super artikel, tusind tak!!

Et spørgsmål, jeg kan ikke få min login.php til at redirecte til user.php, efter jeg logger ind bliver den bare på login.php og der er intet på siden... - jeg ved ikke hvorfor!

Jeg har stort set bare kopieret alle koder fra din artikel, men det virker stadig ikke - nogle idéer til hvorfor dette kunne være??

Nicholas


Hej

Jeg har det samme problem.
Når jeg så istedet submitter login.php fra login.htm, får jeg at vide at brugeren ikke eksisterer.

Kan ikke lige gennemskue hvor fejlen ligger. Håber der er en barmhjertig sjæl der kan hjælpe mig.

Tage
User
Bruger #13920 @ 02.08.11 15:09
Først og fremmest tak for en god artikel - jeg er dog stødt på et enkelt problem:

Jeg får følgende fejlmeddelse, når jeg logger ind og går til user siden.

Fold kodeboks ind/udKode 


Derefter kommer indholdet på user-siden op dog uden at skrive brugernavnet:

Fold kodeboks ind/udKode 


Jeg kan se at det har noget at gøre med disse linjer i koden.

Fold kodeboks ind/udPHP kode 


Men hvad skal jeg gøre for at løse det. Som jeg forstår det forventer mysql_fetch_array en ressource, men får en boolean? Jeg kan ikke helt se hvad jeg kan gøre ved det?

Venlig Hilsen
Jeppe
User
Bruger #5097 @ 01.01.12 14:24
Er ikke noget sikkerhed for SQL injection! Pas på med det!
User
Bruger #17316 @ 24.07.12 21:34
Fantastisk, intet mindre, jeg har længe søgt informationer om mysql og hvordan jeg fra en webside kan sende info.
lavede filerne imens jeg læste igennem første gang og alt virkede.

Jeg har ikke tidligere set så flot en gennemgang uden unødigt sludder af noget som helst programmering, de fleste andre kommer med meget forvirrende materiale ind i mellem.

TAK
mvh
Keld
Du skal være logget ind for at skrive en kommentar.
t