Avatar billede farhang Nybegynder
30. september 2006 - 14:22 Der er 25 kommentarer og
1 løsning

PHP/MySql Login

Hej,

Hvordan kan man nemmest lave et login-system til en administration/backend-side via mysql-database?

Min database struktur er således:

ID  mediumint(9), first_name  varchar(50), last_name  varchar(50), admin_level  int(2), username  varchar(60) , password  varchar(60)
Avatar billede jannek_ek Nybegynder
30. september 2006 - 15:03 #1
mit bud er at bede om username og password i en form, og derefter
$result = mysql_query("select * from `tabel_navn` where `username`='".$_POST["username"]."' and `password`='".$_POST["password"]."'");

if (mysql_num_rows($result) != 1)
die("Forkert brugernavn eller adgangskode");

$row = mysql_fetch_array($result);

$_SESSION["admin_level"] = $row["admin_level"];
...

altså finde brugeren hvor brugernavn og password matcher, og derefter smide de data der skal bruges ind i nogle sessions.
Avatar billede farhang Nybegynder
30. september 2006 - 15:48 #2
hvordan skal mine sessions se ud?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 16:10 #3
du skal huske session_start(); øverst på siden, altså før der er kommet noget output fra dit dokument.
det skal stå i toppen på alle de sider du bruger sessions.

ellers virker sessions som et normalt array. $_SESSION["admin_level"] får altså den værdi som bliver hentet fra databasen. og den husker den så.

så sessions bruges bare som normale variabler:
if ($_SESSION["admin_level"] == 10)
{
...
} else
{
die("Du har ikke adgang!");
}

var det det du mente?
Avatar billede farhang Nybegynder
30. september 2006 - 16:19 #4
Jeg har lavet det sådan:

1. Loginform.php

<form action="login.php" method="post">
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Brugernavn:</font><br>
<input name="username" type="text" size="6" maxlength="6"><br>
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Password:</font><br> 
<input name="password" type="password"  size="6" maxlength="6">
  <br>
  <input type="submit" value="Login">
</form>

2. Login.php

<?php
$conn = mysql_connect("xxxxx", "xxxxx", "xxxxx")
  or die(mysql_error());
$db = mysql_select_db("xxxxx")
  or die(mysql_error());
?>
<?php
$result = mysql_query("select * from `admins` where `username`='".$_POST["username"]."' and `password`='".$_POST["password"]."'");

if (mysql_num_rows($result) != 1)
die("Forkert brugernavn eller adgangskode");

$row = mysql_fetch_array($result);

$_SESSION["admin_level"] = $row["admin_level"];
?>

Jeg er lidt i tvivl om følgende:

Hvordan kan man se om man er logget på? Hvordan kan man bruge sessions på de sider man vil beskytte og give adgang til administration?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 16:35 #5
<?php
session_start(); ////// <------- VIGTIGT for at sessions virker
$conn = mysql_connect("xxxxx", "xxxxx", "xxxxx")
  or die(mysql_error());
$db = mysql_select_db("xxxxx")
  or die(mysql_error());
?>
<?php
$result = mysql_query("select * from `admins` where `username`='".$_POST["username"]."' and `password`='".$_POST["password"]."'");

if (mysql_num_rows($result) != 1)
die("Forkert brugernavn eller adgangskode");

$row = mysql_fetch_array($result);

$_SESSION["admin_level"] = $row["admin_level"];
?>

men når du så kommer videre til den side hvor der skal administreres noget, kan du hente det der er gemt i din session.

altså når du først er logget ind, kan du gå videre til administrationssiden:

admin.php

<?php
session_start();
if ($_SESSION["admin_level"] != 10) // eller hvad der nu står i admin_level
{
die("Du har ikke adgang til denne del!");
} else
{
// form til at rette det man nu skal rette
}

med hensyn til at se om du er logget på, kan du i login.php tilføje
$_SESSION["username"] = $row["username"];

og når du så skal se om man er logget på:
if (isset($_SESSION["username"]))
{
echo "du er logget på som ".$_SESSION["username"];
} else
{
echo "Du er ikke loget på!";
}
Avatar billede farhang Nybegynder
30. september 2006 - 16:36 #6
Skal man kun skrive $_SESSION["admin_level"] i toppen på de sider man vil beskytte og give adgang til administration?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 16:49 #7
<?php
session_start();
if ($_SESSION["admin_level"] != 10)
{
die("Du har ikke adgang til denne del!");
}

hvis det her står i toppen af alle de sider hvor man skal være logget ind for at se dem eller rette dem, bliver de kun vist til dem der har admin_level på 10.

du han ændre != 10 til hvad det skal være.
fx
if ($_SESSION["admin_level"] < 10)

så kan siden kun ses af dem der har 10 eller der over
Avatar billede farhang Nybegynder
30. september 2006 - 17:04 #8
Jeg har skrevet:

admin.php:

<?php
session_start();
if ($_SESSION["admin_level"] > 10) // eller hvad der nu står i admin_level
{
die("Du har ikke adgang til denne del!");
} else
{
// form til at rette det man nu skal rette
}

// med hensyn til at se om du er logget på, kan du i login.php tilføje
$_SESSION["username"] = $row["username"];

// og når du så skal se om man er logget på:
if (isset($_SESSION["username"]))
{
echo "du er logget på som ".$_SESSION["username"];
} else
{
echo "Du er ikke logget på!";
}
?>

Men uanset om jeg er logget på eller ej, så står der "Du er ikke logget på!"! Skal man stadig konnekte til databasen? For at få username udskrevet?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 17:20 #9
Nej hvis de først er gemt i en session, skal der ikke connectes mere til databasen.

men har du husket at tilføje
$_SESSION["username"] = $row["username"];

i login.php
så den kommer til at hedde:

<?php
$session_start();
$conn = mysql_connect("xxxxx", "xxxxx", "xxxxx")
  or die(mysql_error());
$db = mysql_select_db("xxxxx")
  or die(mysql_error());
?>
<?php
$result = mysql_query("select * from `admins` where `username`='".$_POST["username"]."' and `password`='".$_POST["password"]."'");

if (mysql_num_rows($result) != 1)
die("Forkert brugernavn eller adgangskode");

$row = mysql_fetch_array($result);

$_SESSION["admin_level"] = $row["admin_level"];
$_SESSION["username"] = $row["username"]; // <--------- !!!
?>

der er et lille problem i

if ($_SESSION["admin_level"] > 10)

hvis man ikke er logget ind, vil $_SESSION["admin_level"] ikke være sat til noget, og derfor betragtes den som 0, og er derfor mindre end 10...

hvis du bruger den her linie istedet, sikre du at den har en værdi, men hvis værdien er 0, stror den ikke den har en værdi.

if ($_SESSION["admin_level"] > 10 && isset($_SESSION["admin_level"]))

når du logger ud, skal du ha en side, der har følgene linier:
<?php
session_start();
unset($_SESSION["admin_level"]);
unset($_SESSION["username"]);
?>
Avatar billede jannek_ek Nybegynder
30. september 2006 - 17:25 #10
Jeg har lige samlet det hele:

1. Loginform.php

<form action="login.php" method="post">
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Brugernavn:</font><br>
<input name="username" type="text" size="6" maxlength="6"><br>
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Password:</font><br>
<input name="password" type="password"  size="6" maxlength="6">
  <br>
  <input type="submit" value="Login">
</form>

2. Login.php

<?php
session_start();
$conn = mysql_connect("xxxxx", "xxxxx", "xxxxx")
  or die(mysql_error());
$db = mysql_select_db("xxxxx")
  or die(mysql_error());


$result = mysql_query("select * from `admins` where `username`='".$_POST["username"]."' and `password`='".$_POST["password"]."'");

if (mysql_num_rows($result) != 1)
die("Forkert brugernavn eller adgangskode");

$row = mysql_fetch_array($result);

$_SESSION["admin_level"] = $row["admin_level"];
$_SESSION["username"] = $row["username"];
?>

3. Admin.php

<?php
session_start();
if ($_SESSION["admin_level"] > 10 && isset($_SESSION["admin_level"]))
{
  die("Du har ikke adgang til denne del!");
}

if (isset($_SESSION["username"]))
{
echo "du er logget på som ".$_SESSION["username"];
} else
{
echo "Du er ikke logget på!";
}
?>
Avatar billede farhang Nybegynder
30. september 2006 - 17:53 #11
Uanset om jeg logger på eller ej. Så kan jeg se indholdet på min admin.php, er det meningen? Eller skal jeg nøjes med:

<?php
session_start();
if ($_SESSION["admin_level"] > 10 && isset($_SESSION["admin_level"]))
{
  die("Du har ikke adgang til denne del!");
}
?>

På mine administrationssider?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 18:07 #12
hmm hvad skal admin_level være for at man må se siden?

jeg glemte også at lave en logoff funktion i det jeg skrev oven over:

2. Login.php

<?php
session_start();
$conn = mysql_connect("xxxxx", "xxxxx", "xxxxx")
  or die(mysql_error());
$db = mysql_select_db("xxxxx")
  or die(mysql_error());


$result = mysql_query("select * from `admins` where `username`='".$_POST["username"]."' and `password`='".$_POST["password"]."'");

if (mysql_num_rows($result) != 1)
{
unset($_SESSION["admin_level"]);
unset($_SESSION["username"]);
die("Forkert brugernavn eller adgangskode");
}

$row = mysql_fetch_array($result);

$_SESSION["admin_level"] = $row["admin_level"];
$_SESSION["username"] = $row["username"];
?>


Når man logger på med forkert bruger navn, logger den en ud hvis man allerede er logget på
Avatar billede farhang Nybegynder
30. september 2006 - 19:47 #13
Hej,

Jeg tror at du misforstår mig! Jeg har f.eks. et par sider, som kun administration må se, når jeg skriver følgende på disse sider:

<?php
session_start();
if ($_SESSION["admin_level"] > 10 && isset($_SESSION["admin_level"]))
{
  die("<a href=\"loginform.php\">Du har ikke adgang til denne del!</a>");
}

if (isset($_SESSION["username"]))
{
echo "du er logget på som ".$_SESSION["username"];
} else
{
echo "Du er ikke logget på!";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
fortroligt
<body>
</body>
</html>

så kan man stadig se "fortroligt"-teksten, hvis man ikke er logget på, der må være en fejl, ikke?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 19:59 #14
hov min fejl
if ($_SESSION["admin_level"] > 10 && isset($_SESSION["admin_level"]))
erstattes med:
if ($_SESSION["admin_level"] > 10 && empty($_SESSION["admin_level"]))

så burde det virke
Avatar billede jannek_ek Nybegynder
30. september 2006 - 20:01 #15
eller nej skriv
if ($_SESSION["admin_level"] > 10)
Avatar billede jannek_ek Nybegynder
30. september 2006 - 20:04 #16
beklager jeg er ikke alt for skarp lige nu

der skal stå:
if ($_SESSION["admin_level"] > 10 && !isset($_SESSION["admin_level"]))

så kan man kun se det hvis admin_level er 1-10
Avatar billede farhang Nybegynder
30. september 2006 - 22:11 #17
Nu har jeg prøvet alle dine koder, men ingen af dem virker efter hensigten. Stadigvæk samme problem. Hvad gør vi forkert?
Avatar billede jannek_ek Nybegynder
30. september 2006 - 23:27 #18
først hvad er værdien i admin_level hos dem der har adgang til at se tingene??
Avatar billede farhang Nybegynder
01. oktober 2006 - 00:01 #19
admin_level = 1
Avatar billede jannek_ek Nybegynder
01. oktober 2006 - 00:11 #20
<?php
session_start();
if ($_SESSION["admin_level"] != 1)
{
  die("<a href=\"loginform.php\">Du har ikke adgang til denne del!</a>");
}
?>

alt unnder disse liner bliver KUN vist hvis admin_level er 1!

tjek med

<?php
echo $_SESSION["admin_level"];
?>
Avatar billede jannek_ek Nybegynder
01. oktober 2006 - 00:13 #21
det kan være at den stadig tror du er logget ind. Så lav en side du kan gå ind på, hvor der står:

<?php
session_start();
unset($_SESSION["admin_level"]);
?>
Avatar billede farhang Nybegynder
01. oktober 2006 - 00:34 #22
Perfekt, det virker.

Hvor siger du jeg skal skrive:

<?php
session_start();
unset($_SESSION["admin_level"]);
?>
Avatar billede jannek_ek Nybegynder
01. oktober 2006 - 00:51 #23
ja du kan fx lave an knap der hedder "log af" på alle siderne:
<a href="logoff.php">log af</a>

og så skal logoff.php bare indeholde:

<?php
session_start();
unset($_SESSION["admin_level"]);
unset($_SESSION["username"]);
?>


så bliver din session tømt.
Avatar billede jannek_ek Nybegynder
01. oktober 2006 - 01:23 #24
Hov må hellere lige smide et svar :P
Avatar billede jannek_ek Nybegynder
01. oktober 2006 - 02:40 #25
hov det var ikke et svar :(
Avatar billede jannek_ek Nybegynder
01. oktober 2006 - 13:05 #26
takker :P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

KMD A/S

Projektleder

Netcompany A/S

Linux Operations Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger Entreprise Arkitekt

Capgemini Danmark A/S

AI/Data Engineer