Fra begynder til login

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

Indsæt i databasen
Vi har nu udtrykket de data brugeren indtastede i systemet og mangler altså kun at indsætte brugere i databasen.
Til filen indsaet.php tilføjes:

Fold kodeboks ind/udPHP kode 


Det første vi er nødt til for at arbejde med vores database er at oprette en forbindelse til den. Dette sker ved de første to linjer kode. Den første linje skal rettes til, så det passer med de oplysninger dit webhotel/server/lokale installation bruger. Du vil oftest finde disse oplysninger et sted i dit kontrolpanel på dit webhotel.
Anden linje fortæller hvilken database vi gerne vil arbejde med. På nogle webhoteller har man kun en database til rådighed, og så vil navnet på den nok stå oplyst samme sted som de resterende oplysninger. I andre tilfælde kan man selv oprette databaser, og så vælger du blot et passende navn.

Det næste der sker at vi tjekker hvorvidt der har været nogen fejl i brugerens indtastninger. Hvis det ikke er tilfældet ($errorCount er 0), så vil vi gerne indsætte dataene i databasen. Først vil vi dog lige kryptere passwordet, da det så ikke kan ses direkte i databasen.

Næste linje benytter sig af php-funktionen mysql_query(), denne funktion bruges til alt der har med ændring i databasen at gøre. Om det så gælder udtagning, indsætning, opdatering eller sletning af data. Funktionen tager en SQL-kommando som argument. I dette tilfælde benytter vi INSERT INTO der indsætter data i tabellen. Den første parantes angiver de felter i tabellen vi vil indsætte data i, mens den anden tabel angive hvilke data der skal indsættes i felterne.

Til sidste tjekkes det, at vores MySQL-kommando ikke gav en fejl.
Det er nu muligt at oprette en bruger som indsættes i vores MySQL-tabel.

Login


HTML-delen
Til at logge ind bruges en simpel html-form der minder meget om oprettelsesformen.

login.htm
Fold kodeboks ind/udHTML kode 


Formen ligner den vi brugte til oprettelsen, og fungerer lige sådan. Bruger-inputtet sendes igen med metoden "post", denne gang sender vi blot brugeren hen til login.php i stedet for indsaet.php.

PHP-delen
PHP-delen af login-scriptet skal tjekke om brugernavn og password passer sammen, og om det indtastede brugernavn overhovedet eksisterer i vores brugertabel. I fald brugernavn og password matcher og eksisterer i vores tabel, skal brugeren registreres som logget ind.

Vi tager det en del af gangen - første tjekker vi med databasen:

login.php
Fold kodeboks ind/udPHP kode 


Koden her er lidt lang, men vi gennemgår den linje for linje, så det skal nok gå.
Første linje lader vi dog lige ligge til lidt senere.
De to næste linje kender vi fra oprettelsen. De forbinder til databasen.
Herefter defineres variabler til vores bruger-input, nøjagtigt som i oprettelses-delen.

Den første nye del i koden er SQL-kommandoen i linje 11. Vi bruger igen den indbyggede funktion mysql_query(). Denne gang vil vi gerne have data ud af vores tabel. Dette gøres med SELECT id,brugernavn,password FROM brugere, her vælges 3 felter fra tabellen brugere. I stedet for at vælge specifikke felter kan man bruge SELECT * FROM, hvorved alle felter vælges.
Næste del af SQL-kommandoen starter med WHERE, hvilket fortæller databasen at vi kun vil have nogle bestemte rækker fra tabellen. I dette tilfælde de rækker hvor brugernavnsfeltet er ens med det brugernavn der er blevet indtastet.

Vi bruger nu endnu en indbygget PHP-funktion, nemlig mysql_num_rows(), som tæller hvor mange rækker der blev fundet ved den query vi giver den som argument. Hvis ikke den finder en række eksisterer brugeren ikke.

Findes der derimod en række med det brugernavn der er tastet ind, så vil vi gerne have resten af de info der er i den række. Dette gøres med funktionen mysql_fetch_array, der giver en tabel-række som et array med feltnavnene som nøgle (dvs. indholdet i et felt kan tilgås ved $array['feltnavn']).
Det sidste der tjekkes er om det password der er indtastet stemmer overens med det password der står i databasen. Hvis ikke det gør det angiver vi en fejl i fejlvariablen.

Sessions
Til dette login-system bruges sessions til at registrere at en bruger er logget ind. Der findes også en anden metode til dette, nemlig cookies, som dog er lidt mere besværlig.
Den første linje i login.php - "session_start();" - fortæller at vi på denne side anvender sessions. Denne skal bruges på alle sider for at kunne se at brugeren er logget ind.

Den sidste del af login-koden tilføjes:

login.php
Fold kodeboks ind/udPHP kode 


Koden er rimeligt simpel. Først tjekker vi om vores fejlvariabel indeholder nogen fejl. Hvis den gør det udskrives fejlene og en tilbageknap.
Hvis det ikke er tilfældet skal vi have sat de sessions der viser at vi nu er logget ind. Dette gøres med $_SESSION["navn"], hvor 'navn' er navnet på den sessions vi vil sætte, så vi kan finde den igen senere. Vi sætter to sessions. En der viser at man er logget ind, og en der indeholder bruger-id'et. Denne session identificerer altså brugeren.

Til sidst sendes en header der sørge for at sende brugeren videre til en ny side, nemlig user.php. Dette er den første beskyttede side man kommer til efter at være logget ind og kan naturligvis ændres.

Beskyttede sider


For at sørge for, at det kun er brugere der er logget ind der kan se en side tilføjes følgende til siden:

Fold kodeboks ind/udPHP kode 


Det første der sker er at session'en startes, så vi kan bruge vores _SESSION-variabler. Derefter tjekkes det hvorvidt brugeren er logget ind, og hvis det er tilfældet hentes brugerens data ud fra databasen, klar til brug på siden.

Opsamling


Loginsystemets bestanddele er nu færdigt, der mangler blot koblingen mellem de forskellige sider. Den kunne se sådan her ud:

Fold kodeboks ind/udHTML kode 


Test systemet og leg lidt rundt med designet. Du kan også tilføje ekstra felter til din brugertabel, fx alder og køn. Du kan tilføje felterne i oprettelsesformularen og udskrive dem på en side, eller lave statistik over gennemsnitsalder og kønsfordeling.
Der er tusinder af muligheder, ud fra dette simple grundlag.

Afsluttende kommentar


Artiklen her er også at finde på min hjemmeside Silwing.dk.
Dette er første udgave af artiklen, så al feedback er mere end velkommen.



<< < 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