Top
Phpuniverset logo
 

INDHOLD

Forside

Job annoncer

Tips og Tricks

Konkurrence

Downloads

Dokumenter

PHP bog shop

Forum

Online udviklere


Propelcom

ARTIKLER

CSS

Diverse

E-handel / annoncer

Grafik

Html

Internet

Javascript

Linux

PHP/MySQL

Programmer

Flash

Søgemaskiner

Windows

C / C++


INFO

Information

Annoncering

Kontakt

Brugersystem i PHP/MySQL

Forside Kategori PHP/MySQL Brugersystem i PHP/MySQL




 

Indledning

Denne lille samling af 5 små scripts vil hjælpe dig med at få et lille login system op og køre. Scriptet tager brug at en lille tabel(users) i MySQL med to kolonner hhv. kalder "brugernavn" og "password". Det er meningen at man skal oprette sig først så ens brugernavn og kodeord bliver "installeret" i mysql-tabellen. Herefter logger man sig ind helt normalt i en html-form med to felter "brugernavn" og "password".
Som sagt består loginsystemet her af 5 forskellige filer. Det er opret.php, opret-ok.php, login.php, login-ok.php og config.php. Disse 5 php-scripts arbejder sammen. F.eks. er det meningen at man skal bruge opret.php for at "installere" rækken(eller en ny) i mysql-tabellen.

Men lad os starte med at kigge specifikt på de forskellige filer.

Vi kigger på opret.php

Opret.php er egentlig ikke andet end en helt normalt html-form. Den består at 2 INPUT felter og et SUBMIT-knap som man kan navngive til hvad som helst(men som her hedder "Opret".

 <form action="javascript:void(0);" method="post">
Brugernavn: <input type="text" name="brugernavn"><br>
Password: <input type="password" name="password"><br>
<input type="submit" name="opret" value="Opret">
</form>


Selve html formen: opret.php

 <html><head></head><body>
<form action="opret-ok.php" method="post">
Brugernavn: <input type="text" name="brugernavn"><br>
Password: <input type="password" name="password"><br>
<input type="submit" name="opret" value="Opret">
</form></body></html>


Det som her udnyttes ved html-formen er at alle elementer med attributten "name" bliver sendt videre til php-scriptet oplyst i action-attributten. Som man kan se i første linie sender formen data til opret-ok.php. Dvs. at opret-ok.php modtager 3 variabler med data fra formen. Dem kan vi nemt hente i php-scriptet(hvilket også er meningen). Som man kan se har knappen navnet "opret", dvs. at en variabel kaldet $opret nu eksisterer til rådighed for opret-ok.php. Det viser så at man skal kalde den variabel via en superglobal servervariabel - lyder det lidt langhåret lader vi det ligge indtil videre.
Lad os bare sige at opret-ok.php nu har disse variabler til rådighed:


$brugernavn med tekststrengen man skriver i feltet "brugernavn". 
$password med tekststrengen man skriver i feltet "password".


$opret med tekststrengen "Opret" hvis man kom til opret-ok.php via denne form, dvs. ikke tom.



Vi kigger på opret-ok.php


Opret-ok.php er det script som opretter dig i mysql-databasen. Den tilføjer simpelthen brugernavn og password du skriver i formen fra opret.php. Men den tjekker også om brugernavnet allerede eksisterer, og hvis det gør får du det at vide.

 <?php // PHP script start.
require("config.php"); // Variabler til mysql hentes
$opret = &$HTTP_POST_VARS['opret'];
if(empty($opret)) {
print "Du skal aktivere dette script vha. formen i opret.php."
?>
<br><a href="opret.php">Klik her for at oprette bruger</a>
<?php
} else {

$brugernavn = &$HTTP_POST_VARS['brugernavn']; // Brugernavn fra form i opret.php.
$password = &$HTTP_POST_VARS['password']; // Password fra form i opret.php.

if(empty($brugernavn) OR empty($password)) { //Her tjekkes om ET af felterne er tomme.
echo 'Et af felterne er tomme';}
else {
// Her åbnes for mysql-serveren og der logges ind med data fra config.php.
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db); // Der åbnes for databasen defineret i config.php.

$result = mysql_query("select brugernavn from users where brugernavn = '$brugernavn'")
or die (mysql_error());
$number = mysql_num_rows($result);
if ($number > 0) {
print 'Desværre brugernavnet er optaget';
} else {
mysql_query("insert into users (brugernavn, password) values ('$brugernavn', '$password')")
or die(mysql_error());
print "Brugernavn $brugernavn er oprettet!";
?>
<a href="login.php">Klik her for at logge ind</a>
<?php
}
}
}
?>

Her ses config.php:

 
<?php
// MySQL Variabler
$mysql_host = "localhost"; //her skriver du host til mysql.
$mysql_user = "root"; //skriv brugernavn til mysql, default root.
$mysql_pw = ""; //skriv dit password til mysql.
$mysql_db = ""; //skriv databasen du vil bruge her.

?>

Gennemgang af opret-ok.php

 require("config.php"); // Variabler til mysql hentes


Det som sker allerførst er at scriptet henter de variabler den skal bruge for at kommunikere med mysql, de ligger i config.php. Det drejer sig som sædvanlig om host, username og password til at logge ind i mysql-serveren og database navnet. Disse 4 ting er nogle du bliver nødt til at skrive selv i config.php.

 $opret = &$HTTP_POST_VARS['opret'];


Herefter kommer der en linie hvor variablen $opret oprettes ved at blive defineret vha. eller via $HTTP_POST_VARS['opret']. $HTTP_POST_VARS['opret'] er tekstrengen hentet fra formen i opret.php. Man sætter et "&" foran variablen hvis man vil oprette en ny variabel som er defineret vha. af en anden. $HTTP_POST_VARS['felt'] er en suberglobal variabel som henter data fra en form. Dette kan undgås hvis man roder lidt med en parametre for PHP-compileren, men lad os blot gøre som her.

 if(empty($opret)) {
print "Du skal aktivere dette script vha. formen i opret.php."
?>
<br><a href="opret.php">Klik her for at oprette bruger</a>
<?php
} else {


Vi har her den første if...else-sætning. Denne sætning kontrollerer om vores nye variabel $opret er tom. Hvis den er har den ikke værdien "Opret" defineret i html-form, value-attributen, og altså er man kommet til opret.php af andre veje. Dette er en meget løs sikkerhed og kan nemt omgås ved at definere variablen som en parameter til scriptet, så måske skulle du prøve at omdøbe variablen til tal eller noget andet. If-sætningen skriver blot noget tekst ved condition TRUE, hvorimod ved condition FALSE resten af scriptet udføres istedet... Klammen som lukker else-sætning forekommer derfor helt tilsidst lige før ?>.

 $brugernavn = &$HTTP_POST_VARS['brugernavn'];
$password = &$HTTP_POST_VARS['password'];


Her oprettes de 2 variabler $brugernavn og $password vha. af den suberglobale variabel fra før.

 if(empty($brugernavn) OR empty($password)) {
echo 'Et af felterne er tomme';}
else {


Her starter endnu en if...else-sætning som tjecker om enten $brugernavn ELLER $password er tomme variabler. Hvis dette er tilfældet bliver man bedt om at skrive i begge felter, hvis de begge er udfyldte eksekveres resten af scriptet... Lukke-klammen til denne else-sætningen er altså den anden sidste i bunden af opret-ok.php.

 // Her åbnes for mysql-serveren og der logges ind med data fra config.php.
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db); // Der åbnes for databasen defineret i config.php.

Der åbnes for MySQL-serveren(og specifik database) med parameter-værdierne sat i config.php.

 $result = mysql_query("select brugernavn from users where brugernavn = '$brugernavn'")
or die (mysql_error());
$number = mysql_num_rows($result);


Here comes the tricky part. Det synes jeg ihvertfald. Men egentlig ikke. Det der sker her er en forespørgsel til MySQL om at lave et resultatsæt fra bestemte steder med bestemte værdier. Her menes specifikt at mysql skal vælge kolonnen "brugernavn" i tabellen users, og kigge efter rækker hvor brugernavn = $brugernavn. Alle disse rækker skal mysql lave et resultatsæt af og kalde $result. Vi får jo kun en enkelt række da der kun kan være en enkelt bruger med samme navn. Derfor kan vi med funktionen mysql_num_rows($result); få oplyst hvor mange rækker der er i resultatsættet. Dette tal gemmes i $number. Der er en række hvis brugernavnet eksisterer($number = 1, også $number < 0), og nul rækker hvis brugernavnet ikke er oprettet endnu($number = 0). Den midterste linie definerer hvad der skal ske hvis man får en fejl fra mysql: scriptet stopper simpelthen.

 if ($number > 0) {
print "Desværre brugernavnet $brugernavn er optaget";
} else {
mysql_query("insert into users (brugernavn, password) values ('$brugernavn', '$password')")
or die(mysql_error());
print "Brugernavn $brugernavn er oprettet!";
?>
<a href="login.php">Klik her for at logge ind</a>
<?php
}
}
}
?>

Endnu en if...else-sætning. Denne her tjecker om $number er større end nul. Hvis dette er tilfældet eksisterer brugernavnet jo allerede og man får en fejl meddelelse. Else-sætningen eksekveres hvis $number ikke er større end nul(altså nul i dette tilfælde). Dette betyder jo også at $brugernavn ikke fandtes i kolonnen brugernavn, og derfor kan denne oprettes. Linie 4 øverst er en besked til mysql om at indsætte $brugernavn og $password ind i tabellen users i hhv. kolonnerne brugernavn og password(egentlig skrevet omvendt end forespørgslen til mysgl)... Her ses også at ved fejl stopper scriptet. Herefter skrives teksten: Brugernavn $brugernavn er oprettet!, og man får mindsandten et link videre til login.php. Herefter kommer 3 lukke-klammer, den første til denne else-sætning, derefter til else-sætningen i toppen hvor scriptet blev eksekveret hvis begge felter var udfyldte. Den sidste klamme lukker den allerførste else-sætning hvor scriptet kun blev eksekveret hvis $opret ikke var tom.
Lad os gå videre til login.php.



Vi kigger på login.php


 Login.php er faktisk af samme type som opret.php, men denne skal bruges til at logge eksisterende brugere ind med. Login.php består af en helt normalt html-form. <form action="javascript:void(0);" method="post">
Brugernavn: <input type="text" name="brugernavn"><br>
Password: <input type="password" name="password"><br>
<input type="submit" name="login" value="Login">
</form>


Selve html formen: login.php

 <html><head></head><body>
<form action="login-ok.php" method="post">
Brugernavn: <input type="text" name="brugernavn"><br>
Password: <input type="password" name="password"><br>
<input type="submit" name="login" value="Login">
</form></body></html>

Her ses at den eneste forskel er hvilket php-script som modtager variabler, og så er variablen $opret ændret til $login. Den bruges på samme måde i login-ok.php.


Vi kigger på login-ok.php


Login-ok.php er ikke overraskende nok scriptet som tjecker om det skrevne brugernavn og password faktisk eksisterer i mysql-tabellen. Jeg vil gennemgå denne fil ligesom jeg gjorde det med opret-ok.php.

 <?php // PHP script start.
require("config.php"); // Variabler til mysql hentes
$login = &$HTTP_POST_VARS['login'];

if(empty($login)) {
echo 'Denne side kræver login adgang'; }
else {

$brugernavn = &$HTTP_POST_VARS['brugernavn']; // Brugernavn fra form i login.php.
$password = &$HTTP_POST_VARS['password']; // Password fra form i login.php.


if(empty($brugernavn) OR empty($password)) { //Her tjekkes om ET af felterne er tomme.
echo 'Et af felterne er tomme'; }
else { // Denne klamme starter alt script der udføres HVIS begge felter er udfyldte.

// Her åbnes for mysql-serveren og der logges ind med data fra config.php.
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db); // Der åbnes for databasen defineret i config.php.

// Hvis brugernavn skrevet i feltet eksisterer i tabellen, hentes denne række ud.
$result_user = mysql_query("select brugernavn from users where brugernavn = '$brugernavn'")
or die (mysql_error()); // Her stoppes scriptet ved fejl fra mysql-server.
// Hvis password skrevet i feltet eksisterer i tabellen, hentes denne række ud.
$result_pw = mysql_query("select password from users where password = '$password'")
or die (mysql_error()); // Her stoppes scriptet ved fejl fra mysql-server.

// Her sker det egentlige tjeck om brugernavn og password er dem som står i databasen.
// Der oprettes først et array med de data vi fik fra mysql før.
$array_user = mysql_fetch_array($result_user); // Først et med brugernavn.
$array_pw = mysql_fetch_array($result_pw); // Og et med password.
// Her tjeckes så om både array med brugernavn og password indeholder data
// magen til dem skrevet i felterne i html-formen
// PASSWORD KONTROL
if($array_user['brugernavn'] == $brugernavn AND $array_pw['password'] == $password) {
echo 'korrekt password'; // Brugernavn og password passede!!
} // Her lukker vi condition TRUE fra password kontrol

else { // Her starter condition FALSE på password kontrol
echo 'forkert password';
} // Her lukkes condition FALSE på password kontrol.

} // Her lukker vi for condition FALSE på tomme-felter-tjek.
}
?>

Gennemgang af login-ok.php
 
require("config.php"); // Variabler til mysql hentes
$login = &$HTTP_POST_VARS['login'];

Her modtager scriptet de variabler den skal bruge til at åbne for mysql-serveren, og $login oprettes og defineres vha. af den superglobale variable der blev nævnt i gennemgang af opret-ok.php.

 if(empty($login)) {
echo 'Denne side kræver login adgang'; }
else {

Vi benytter her $login og tjekker om denne er tom. Hvis den er kommer der en fejlmeddelelse og scriptet kommer ikke videre. Hvis $login ikke er tom får resten af scriptet lov til at køre(akkurat ligesom i opret-ok.php).

 $brugernavn = &$HTTP_POST_VARS['brugernavn']; // Brugernavn fra form i login.php.
$password = &$HTTP_POST_VARS['password']; // Password fra form i login.php.

Variablerne $brugernavn og $password oprettes og defineres vha. af data fra formen...

 if(empty($brugernavn) OR empty($password)) { //Her tjekkes om ET af felterne er tomme.
echo 'Et af felterne er tomme'; }
else { // Denne klamme starter alt script der udføres HVIS begge felter er udfyldte.

Her tjeckes igen om et af felterne er tomme. Hvis ja så kommer der en fejlmeddelelse, ellers får resten af scriptet lov til at køre.

// Her åbnes for mysql-serveren og der logges ind med data fra config.php.
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db); // Der åbnes for databasen defineret i config.php.

// Hvis brugernavn skrevet i feltet eksisterer i tabellen, hentes denne række ud.
$result_user = mysql_query("select brugernavn from users where brugernavn = '$brugernavn'")
or die (mysql_error()); // Her stoppes scriptet ved fejl fra mysql-server.
// Hvis password skrevet i feltet eksisterer i tabellen, hentes denne række ud.
$result_pw = mysql_query("select password from users where password = '$password'")
or die (mysql_error()); // Her stoppes scriptet ved fejl fra mysql-server.

Her åbnes allerførst for adgang til mysql-serveren og databasen. Herefter beder vi igen mysql om at oprette specifikke resultatsæt. Denne gang skal vi bruge 2 styks, en for brugernavn og en for password. $result_user er defineret som enkelt række men kun med data fra kolonnen "brugernavn", som er ligmed $brugernavn. Det er samme med $result_pw, blot er det istedet i kolonnen password, og rækken med data som er ligmed $password. Det forgår altsammen i tabellen users. Her stoppes scriptet også ved fejl fra mysql.

// Der oprettes først et array med de data vi fik fra mysql før.
$array_user = mysql_fetch_array($result_user); // Først et med brugernavn.
$array_pw = mysql_fetch_array($result_pw); // Og et med password.

Her oprettes så to arrays eller lister med brugernavn og password. Det skal forstås på den måde at hvergang man kalder f.eks. mysql_fetch_array($result_user);, så tildeles dette array nye værdier som måtte stå i næste række i resultatsættet $result_user. Der er så kun en enkelt række i $result_user(og $result_pw) men ideen er den samme. De 2 nye arrays vil fungere sådan at de får nogle keys med kolonnerne i resultatsættet, altså får $array_user en enkelt key ['brugernavn'] og $array_pw får ['password'].

// Her tjeckes så om både array med brugernavn og password indeholder data
// magen til dem skrevet i felterne i html-formen
// PASSWORD KONTROL
if($array_user['brugernavn'] == $brugernavn AND $array_pw['password'] == $password) {
echo 'korrekt password'; // Brugernavn og password passede!!
} // Her lukker vi condition TRUE fra password kontrol

else { // Her starter condition FALSE på password kontrol
echo 'forkert password';
} // Her lukkes condition FALSE på password kontrol.

} // Her lukker vi for condition FALSE på tomme-felter-tjek.
}
?>

Her bruger vi så de 2 arrays, hvor vi opstiller en if...else sætning som tjecker om både $brugernavn og $password er ligmed de data som står oplistet i det pågældende array. Der er sat et AND ind, hvilket jo betyder at begge logiske udsagn skal være sande for at condition TRUE eksekveres. Efter dette komme else-sætningen som jo eksekveres hvis $brugernavn og $password ikke var og finde i mysql-tabellen. Tilsidst lukkes begge else-sætninger hvor den sidste tilhører den første hvor $login ikke måtte være tom for at resten(næsten det hele) af scriptet kunne eksekvere. Samme terminologi blev benyttet i opret-ok.php.


Installation af scripts


Jeg har ikke direkte mulighed for evt. at zippe filerne og lægge et link her. Det du gør istedet er at kopiere teksten fra boksene med de hele filer. Dette gøres med alle 5 filer. du navngiver disse filer og gemmer dem i et bibliotek for sig.
Herefter skal du have oprettet en tabel i en mysql database. Dette kan gøres på mange måder. Den jeg bruger selv er at paste følgende tekst ind i phpMyAdmin.

 CREATE TABLE users (
id int(10) unsigned DEFAULT '0' NOT NULL auto_increment,
brugernavn varchar(16),
password varchar(16),
PRIMARY KEY (id)
)

Dette opretter tabellen users, men du må så selv vælge hvilken database det sker i. Husk og skriv de relevante data i config.php, så kan det vist ikke gå helt galt.



Skrevet af: Ole Buus| Dato : 2004-02-18 18:5 | Læst : 27511 gange | Print

Din kommentar og karakter til artiklen

Din karakter:

1

2

3

4

5

6

7

8

9

10

Kommentar:

Log ind for at give en karakter og kommentar.

Kommentarer og karakterer til artiklen

 


4/10

"Jeg ville give den MEGET højre karakter, vis jeg kunne få opret-ok.php til at virke. Det vil bare ikke virke, vis du kan hjælpe mig så skriv en pb, så får du min mail :) Jeg ville blive super taknemlig vis nogle gad hjælpe mig med denne ene fil (:"

CG | 14.05.2010, 13:06

 


10/10

"100% Genial forklaring. Enormt uddybende så man virkelig forstår hvad det handler om selvom man stort set intet ved om PHP/MySQL Jeg skulle bruge det til et event tilmeldingssystem hvilket var rigtigt nemt at bygge det om til når det var så godt beskrevet. Mere af den slags forklaringer! Det kunne dog haved været rart hvis alt var skrevet i PHP, også formen."

Rasmus Frisk | 19.09.2009, 18:02

 


7/10

"Kan ikke få det til at virke... :S"

Yoh | 07.12.2007, 18:13

 


10/10

"Super super godt lavet denne artikel..! De eneste fejl som jeg stødte på. Var dem som jeg selv havde lavet..!! ;) Men ja, super artikel. - helt klart 10 her fra..!"

Alexander Christensen | 01.12.2007, 21:15

 


3/10

"hva med et færdigt dokument man kan downloade og bruge direkte til hjemmeside ? "

lasse | 01.10.2007, 12:53

 


9/10

"Du tager ikke fejl Niels. Jeg gjorde det samme :) Ændrede $result_pw = mysql_query("SELECT password FROM users where password = '".$password."'") til $result_pw = mysql_query("SELECT password FROM users where brugernavn = '".$brugernavn."'")for at undgå at kunne login med et andet password."

Michael Madsen | 24.05.2007, 15:32

 


9/10

"Jeg vil mene at der er en mindre fejl i koden hvis man skal tjekke password på brugeren. login-ok.php checker om seperat password og seperat bruger eksisterer, ikke om de er i samme række i tabellen. Derfor er det muligt at logge en bruger ind med en andens password, så længe begge eksisterer i tabellen. Dette kan ændres ved at rette dette: """ // Hvis brugernavn skrevet i feltet eksisterer i tabellen, hentes denne række ud. $result_user = mysql_query("select brugernavn from users where brugernavn = '$brugernavn'") or die (mysql_error()); // Her stoppes scriptet ved fejl fra mysql-server. // Hvis password skrevet i feltet eksisterer i tabellen, hentes denne række ud. $result_pw = mysql_query("select password from users where password = '$password'") or die (mysql_error()); // Her stoppes scriptet ved fejl fra mysql-server. """ Til: """ $result_pw = mysql_query("select password from users where brugernavn = '$brugernavn'") or die (mysql_error()); $result_user = mysql_query("select brugernavn from users where password = '$password'") or die (mysql_error()); """ Ret mig hvis jeg tager fejl :)"

Niels Christian | 25.08.2006, 23:30

 


9/10

"God Artikel!! :)"

Per H | 11.04.2006, 19:33

 


8/10

"Udemærket, Kunne være godt hvis der var bruger niveauer så man kunne lave admin access osv.."

Martin Nørgaard | 15.03.2006, 20:44

 


8/10

"Udemærket, Kunne være godt hvis der var bruger niveauer så man kunne lave admin access osv.."

Martin Nørgaard | 15.03.2006, 20:43

 


5/10

"Hvordan er det at man får det med MySQL-databasen til at fungere. Har downloadet WAMP5 og fået phpMyAdmin til at fungere. Men hvor er det at jeg skal paste teksten fra tekstboxen oppe over? Håber på hjælp. Bortset fra det synes jeg at artiklen er meget brugervenlig."

Søren Svendsen | 08.01.2006, 14:35

 


5/10

"Hvordan er det at man får det med MySQL-databasen til at fungere. Har downloadet WAMP5 og fået phpMyAdmin til at fungere. Men hvor er det at jeg skal paste teksten fra tekstboxen oppe over? Håber på hjælp. Bortset fra det synes jeg at artiklen er meget brugervenlig."

Søren Svendsen | 08.01.2006, 14:28

 


10/10

"Mega fedt :P"

Per Leth | 11.12.2005, 16:56

 


10/10

"Nice!! Men hvordan smækker man f.eks. en admin side ind? :D "

ProMan | 30.11.2005, 20:18

 


8/10

"Nice :) meget nice"

Wacked | 09.10.2005, 03:25

 


10/10

"Det er en rigtig god artikkel! Jeg giver dig sku 10!"

Christo | 08.10.2005, 16:33

 


10/10

"cool virker fino hvis nu jeg vil skrive du er logget in som (her kommer så den bruger der er logget på) istedet for korrekt password"

per | 06.10.2005, 11:01

 


4/10

"jeg kan ikke få mit til at, virke, jeg har gost nok brugt en anden database, end den han siger jeg skal lave, men burde det ikke vrke alligevel?"

buch | 22.09.2005, 17:26

 

Send Artikel/anmeldelse til: phpuni@phpuniverset.dk

Tilbage til oversigt

FORUM

Nyeste forum indlæg :

PHP/Opencart import module

Opencart/php import modul hjælp

Lækkert kontor / kontorfællesskab i Helsingør

Opdatering af PHP

Vurdering af hjemmeside

Nyeste forum svar :

Lækkert kontor / kontorfællesskab i Helsingør

Android programmering

Joomla som CMS

Grafik problemer

Prissammenligningsside

 

MEDLEM

LOGIN ER IKKE MULIGT, MENS VI LAVER NYT SITE
 

NYHEDSBREV

Nyhedsbrev

Tilmeld dig vores nyhedsbrev og modtag nyheder om nye scripts og tips samt om mange andre nye tiltag på Phpuniverset.dk


 

© Copyright 2000 Propelcom Phpuniverset's politik om personlige oplysninger, artikler & Koder Phpuniverset er optimeret til Mozilla 1024 * 768 Phpuniverset version: 3.0 beta
Webhost : Ignesco.dk - android talk & help

Bund