Avatar billede gregblach Nybegynder
06. januar 2006 - 14:13 Der er 5 kommentarer og
1 løsning

Validering af user i MySQL + group_id tilhørsforhold.

Hej Experter (igen-igen),

Jeg har alligevel et par spørgsmål til den kode jeg har fået bikset sammen ved at klippe/klistre lidt. :o)

1. Koden virker som sådan, og jeg kan validere op mod DB'en. Det undrer mig dog at der ikke vises fejlbeskeden "Sorry, wrong username / password" ved forkert username/password kombination. Jeg vil meget gerne have hjælp til at lave denne kode mere fornuftig, evt sådan at det stiller sig over loginformen, som man ofte ser det.

2. Som i kan se i database strukturen nederst, er der lagt op til et group_id tilhørsforhold. Jeg kan ikke finde ud af hvordan jeg skal få dette koblet ind i min nuværende kode - jeg er på bar bund. Lidt kode ville være til stor hjælp! :o)

Pft. /Greg

<------------------------ index.php start...

<html>
<head></head>
<body>

<?php
session_start();
$errorMessage = '';
if (isset($_POST['txtUsername']) && isset($_POST['txtPassword']))
{
  include './include/opendb.php';

  $username = $_POST['txtUsername'];
  $password = $_POST['txtPassword'];

  // check if the username and password combination exist in database
  $sql = "SELECT username
          FROM users
          WHERE username = '$username'
                AND password = PASSWORD('$password')";

  $result = mysql_query($sql)
            or die('Query failed. ' . mysql_error());

  if (mysql_num_rows($result) == 1)
  {
      // the user id and password match, set the session
      $_SESSION['db_is_logged_in'] = true;

      // after login we move to the list page
      header('Location: list.php');
      exit;
  } else
  {
      $errorMessage = 'Sorry, wrong username / password';
  }

  include './include/closedb.php';
}
?>

<form method="post" name="frmLogin" id="frmLogin">
<table width="400" border="1" align="center" cellpadding="2" cellspacing="2">
<tr>
<td width="150">Username</td>
<td><input name="txtUsername" type="text" id="txtUsername"></td>
</tr>
<tr>
<td width="150">Password</td>
<td><input name="txtPassword" type="password" id="txtPassword"></td>
</tr>
<tr>
<td width="150">&nbsp;</td>
<td><input type="submit" name="btnLogin" value="Login"></td>
</tr>
</table>
</form>

</body>
</html>

...index.php slut ------------------------>


<------------------------ list.php start...

<?php
session_start();

// is the one accessing this page logged in or not?
if (!isset($_SESSION['db_is_logged_in'])
  || $_SESSION['db_is_logged_in'] !== true) {

  // not logged in, move to login page
  header('Location: index.php');
  exit;
}
?>

...list.php slut ------------------------>


| users | CREATE TABLE `users` (
  `display_name` varchar(50) NOT NULL default '',
  `password` varchar(50) NOT NULL default '',
  `username` varchar(50) NOT NULL default '',
  `group_id` int(11) NOT NULL default '0',
  `user_id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
Avatar billede jackass- Nybegynder
07. januar 2006 - 13:20 #1
1) $errorMessage = 'Sorry, wrong username / password';

...skal rettes til fx:

echo "<font color=\"red\">Sorry, wrong username / password</font><br><br>";

2) Kommer an på hvad du vil bruge det til.. du kan enten lave en ekstra tabel, hvor du definerer grupperne og deres ID og efterfølgende sammenligner med den "users" tabel.

Eller (som jeg personligt ville foretrække) du kan bare give brugerne et ID i den nuværende tabel og include en fx functions.php hvor du laver en funktion til at matche ID's med brugerlevels/grupper.

Fx.:

function GetGroup($group_id) {
    switch ($tool) {
    case 0:
        return "Ingen adgang!";
        break;
    case 1:
        return "Bruger";
        break;
    case 2:
        return "Superbruger";
        break;
    }
    case 3:
        return "Administrator";
        break;
    }
}
Avatar billede jackass- Nybegynder
07. januar 2006 - 13:20 #2
Hov.. det skulle være: switch ($group_id) {
Avatar billede jackass- Nybegynder
07. januar 2006 - 13:28 #3
Jeg er så stiv... du får den lige som den skal være:

function GetGroup($group_id) {
    switch ($group_id) {
    case 0:
        return "Ingen adgang!";
        break;
    case 1:
        return "Bruger";
        break;
    case 2:
        return "Superbruger";
        break;
    case 3:
        return "Administrator";
        break;
    }
}

Når du så læser i DB'en med:

while ($row = mysql_num_rows($result)) {
  $gruppeid = GetGroup($row['group_id']);
  echo "Dit brugernavn er: " . $row['username'] . ". Gruppe: " . $gruppeid;
}
Avatar billede jackass- Nybegynder
07. januar 2006 - 14:57 #4
Ok? :)
Avatar billede gregblach Nybegynder
08. januar 2006 - 12:00 #5
Hej Jackass-,

Jeg har haft tid til at teste dine forslag i weekenden, men jeg skal nok vende tilbage asap! :o)

/Greg
Avatar billede gregblach Nybegynder
09. januar 2006 - 12:44 #6
Jackass-,

1. Ok. :o)

2. Jeg har nok ikke forklaret mig tydeligt nok, så jeg prøver lige igen. Min user database struktur er vist herunder:

users | CREATE TABLE `users` (
  `display_name` varchar(50) NOT NULL default '',
  `password` varchar(50) NOT NULL default '',
  `username` varchar(50) NOT NULL default '',
  `group_id` int(11) NOT NULL default '0',
  `user_id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Som du kan se, er der et group_id felt. Validering/login af bruger fungerer fint nok på min index.php side, og på efterfølgende sider tjekker jeg om brugeren er logget ind med nedenstående session validering:

<?php
session_start();
if (!isset($_SESSION['db_is_logged_in']) || $_SESSION['db_is_logged_in'] !== true)
{
  header('Location: index.php');
  exit;
}
?>

Det virker også fint. Det jeg gerne vil frem til er at tilføje et yderligere parameter i session checket, således at der kræves exempelvis gruppe 1, eller måske gruppe 1,2 og 3 (eller 2 og 4, eller ), adgang for at kunne læse en side.

Admin gruppen (1) skal selvfølgelig kunne se alt på alle sider, men for øvrige grupper vil jeg gerne frit kunne definere om siden må vises. Er der et adgangsproblem skal der helst stå en lidt sigende meddelelse, såsom 'Your access profile does not permit you to enter this page'.

Håber det giver mere mening nu.
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