一个登录脚本,两个表

时间:2012-11-22 00:16:35

标签: php

我正在为我的学校设计一个网站。

我正在努力解决如何为我的脚本工作,但网站有两个部分。如果教师从表lesson_teachers登录,则应将其重定向到lesson.php。如果学生从表用户登录,则会将其重定向到home.php。

我认为teacher表的select查询可能是这样的:

  SELECT id FROM lesson_teachers WHERE username='$user_login' AND password='$md5password_login' LIMIT 1

我正在尝试将select语句放入下面的登录脚本中,以便两个表中具有用户名和密码的人都可以登录到一个脚本。

               if (isset($_POST["user_login"]) && isset($_POST["password_login"])) {
$user_login = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["user_login"]); // filter everything but numbers and letters
$password_login = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password_login"]); // filter everything but numbers and letters
$md5password_login = md5($password_login);
$sql = mysql_query("SELECT id FROM users WHERE username='$user_login' AND password='$md5password_login' LIMIT 1"); // query the person
//Check for their existance
$userCount = mysql_num_rows($sql); //Count the number of rows returned
if ($userCount == 1) {
    while($row = mysql_fetch_array($sql)){ 
         $id = $row["id"];
}
     $_SESSION["id"] = $id;
     $_SESSION["user_login"] = $user_login;
     $_SESSION["password_login"] = $password_login;
     exit("<meta http-equiv=\"refresh\" content=\"0\">");
    } else {
    echo 'That information is incorrect, try again';
    exit();
}
      }

2 个答案:

答案 0 :(得分:3)

您的用户表应该在用户表中具有角色关系或者至少有一个tinyint 1字段(0表示学生,1表示教师),因此您不必使用2个表来实现此目的。

假装我同意查询,这可能是这样的:

SELECT id, level FROM users WHERE username='$user_login' AND password='$md5password_login' LIMIT 1

学生的等级为0,教师的等级为1。任何与学生或教师相关的数据都可以存储在关系表中。

然后你可以说:

if($row['level'] == 1)
{
    header('Location: /teacher-url');
    exit;
}
else
{
    header('Location: /student-url');
    exit;
}

现在为额外的金块: 请不要使用此方法来比较密码。如果你试图破解,你基本上可以作为另一个用户偶然登录或偶然登录,因为它会删除字符。因此"pa_s$sw==0ord"变为"password"

只需对发布的输入与数据库中存储的sha1加密密码进行sha1(或更好)加密比较。这是用户密码与输入的最佳真实比较。 并且在$ _SESSION中存储密码就没有意义了。你为什么要这样用它?也许如果你告诉我们可以指出你更好的方向。

正如Elias所说,使用PDO或mysqli。在许多其他原因使用它们而不是mysql_函数时,它们将正确消毒。

我应该补充一点,我们都知道如何真正回答你的问题。我们知道你想知道如何用你所拥有的东西来做。但我们拒绝。因为这个习惯应该在变成噩梦之前进行清理。不要故意粗鲁或任何事情,但精心规划的数据库结构和PDO或mysqli的使用将在数据库和代码中节省大量时间。查看关系表,“角色”的概念以及清理用户输入。从那里你可以用一种有意义的方式构建用户系统。

答案 1 :(得分:0)

首先,每个用户/密码对只能找到1个匹配项, 所以而不是

while($row = mysql_fetch_array($sql)){ 
    $id = $row["id"];
}

你可以简单地做

$row = mysql_fetch_array($sql);
$id = $row["id"];

对于教学/学生重定向,您需要在登录时从隐藏变量到身份类型=教师或学生

然后根据这个变量,你可以做

if ($type=='student')
  header('location:home.php');
if ($type=='teacher')
  header('location:lession.php');

设置会话变量后。