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
<?php echo "Hello World"; ?>
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
<?php $world = "verden"; echo "Hej " . $verden . "."; ?>
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 ,
og så vi ser lige hvordan en standard .php-fil kunne se ud:standard.php
<html> <head> <title>Min første php-side</title> </head> <body> <?php $navn = "Silwing"; echo "<h1>Hej " . $navn . "</h1>"; ?> </body> </html>
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):
CREATE TABLE `brugere` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `brugernavn` VARCHAR( 255 ) NOT NULL , `password` VARCHAR( 255 ) NOT NULL )
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
<html> <head> <title>Opret bruger</title> </head> <body> <h1>Opret bruger</h1> <form action="indsaet.php" method="post"> Brugernavn: <input type="text" name="brugernavn"> <br> Password: <input type="password" name="password"> <br> Gentag password: <input type="password" name="gentag"> <br> <input type="submit" value="Opret"> </form> </body> </html>
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
<?php
$brugernavn = $_POST["brugernavn"];
$password = $_POST["password"];
$gentag = $_POST["gentag"];
$errorCount = 0;
if($brugernavn == "")
{
echo "Du skal indtaste et brugernavn.<br>";
$errorCount++;
}
if($password == "")
{
echo "Du skal indtaste et password.<br>";
$errorCount++;
}
if($gentag == "" || $gentag != $password)
{
echo "De to passwordfelter skal have ens indhold.<br>";
$errorCount++;
}
?>
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.
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:
mysql_connect("host","brugernavn","password");
mysql_select_db("database");
if($errorCount == 0)
{
$password = MD5($password);
$insert = mysql_query("INSERT INTO brugere (brugernavn,password) VALUES ('$brugernavn','$password')");
if(!$insert)
{
echo "Der skete en fejl. Prøv igen. <a href=\"javascript:history.back(-1)\">Tilbage</a><br>";
}
else
{
echo "Brugeren blev oprettet. <a href=\"index.php\">Forside</a><br>";
}
}
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
<html> <head> <title>Login</title> </head> <body> <h1>Login</h1> <form action="login.php" method="post"> Brugernavn: <input type="text" name="brugernavn"> <br> Password: <input type="password" name="password"> <br> <input type="submit" value="Opret"> </form> </body> </html>
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
<?php
session_start();
mysql_connect("host","brugernavn","password");
mysql_select_db("database");
$bruger = $_POST["brugernavn"];
$pass = $_POST["password"];
$error = "";
$userQuery = mysql_query("SELECT id,brugernavn,password FROM brugere WHERE brugernavn='$bruger'");
if(mysql_num_rows($userQuery) != 1)
{
$error .= "Brugeren eksisterer ikke.<br>";
}
else
{
$userArray = mysql_fetch_array($userQuery);
if($userArray["password"] != MD5($pass))
{
$error .= "Password og brugernavn passer ikke sammen.<br>";
}
}
?>
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
if($error != "")
{
echo $error . "<a href=\"javascript:history.back(-1);\">Tilbage</a>";
}
else
{
$_SESSION["logged_in"] = 1;
$_SESSION["user_id"] = $userArray["id"];
header("Location: user.php");
}
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:
<?php
session_start();
if($_SESSION["logged_in"] == 1)
{
$userQuery = mysql_query("SELECT * FROM brugere WHERE id='$_SESSION[user_id]'");
$userArray = mysql_fetch_array($userQuery);
// Eksempel på indhold
echo "Hej " . $userArray["brugernavn"] . "!
<br>
og velkommen til denne beskyttede side.";
}
else
{
echo "Du skal være logget ind for at se denne side.";
}
?>
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:
<html> <head> <title>Simpelt loginsystem</title> </head> <body> <h1>Forside</h1> Velkommen til simple dette login-system. <br><br> <a href="opret.htm">Opret bruger</a> <br> <a href="login.htm">Login</a> </body> </html>
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.
Har du en kommentar, ris, ros eller lign. til guiden her er du velkommen til at smide den her.
Det her er fandeme godt.. Har fået mig til at forstå databaser nu, efter en lang dag med dårlige tutorials.
Så mange tak! (-:
Hey, god guide, det heler virker undtaget user.php, det er næsten somom at den glemmer at jeg har logget på ved login.php
Har du en ide om hvad jeg kan have gjort galt ?
Hej Lasse.
Tak. Send mig evt. din user.php og login.php til silwing@gmail.com, så skal jeg se på det.
Super god guide.
Den er pædagogisk opbygget, forklarende og giver godt indblik i koncepterne.
Jeg har to kommentarer.
1) Som jeg forstår guiden så er det muligt at oprette flere brugere med det sammen login, og pga. checket der undersøger om der KUN er et brugernavn, så vil alle de ens brugernavne blive blokerede fra brug. Burde man ikke have et check af om brugernavnet eksisterede i forvejen inden man oprettede?
2) Som guiden er nu er den rigtig god. Er det muligt du kunne udbygge den med noget admin-funktionalitet, så man kan se hvordan det fungerer. F.eks. vil jeg gerne i mit system have mulighed for at en admin kan se en samlet log for aktiviteter brugerne har gjort. Hvordan viser jeg sådan et link/side på baggrund af admin-rettigheder? Jeg har allerede et felt i DB til at repræsentere rettigheden.
Endnu en gang tusind tak for en super guide
Hej Rasmus
Tak for din feedback
har et par rettelser jeg skal have skrevet ind i guiden, som jeg vil se at få gjort snarest.
Ad 1: Det har du helt ret i, normalt laver jeg et tjek ved oprettelse om brugernavnet eksisterer, det må jeg lige have skrevet ind i guiden.
Ad 2: Du kan lave et tjek:

if($userArray["dit-admin-felt"] == din-admin-værdi) {
echo "Admin Link";
}
husk at udskifte værdierne med dine egne værdier
På siderne der kun skal være for admins tjekker du så først om brugeren er logget ind som vist under “Beskyttede Sider”-afsnittet, og derefter tjekker du om de er admins også før du giver dem adgang.
Kan se at du har puttet koderne i bokse, nu kan man bare ikke se hele teksten i nogle af de lange linjer
//Joachim
Savner stadig nogle nye indlæg
Hej Joachim
Der skulle meget gerne være en scrollbar så man kan komme til at se det. Vil på et tidspunkt sørge for at linjerne ikke er for lange
Ja, ville også gerne have tid til at skrive nogle indlæg, men har simpelthen så travlt for tiden.
Hmm.. Kunne ikke rigtig finde den der scrollbar.. Kan lige prøve med en anden browser..
.. Tjah så må jeg jo bare vente på et eller andet..
Så kom scrollbaren(e)