0

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

我正在努力如何为我的脚本工作,但该网站有两个部分。如果教师登录,从表课程教师,它应该将他们重定向到课程.php。如果学生从表 users 登录,它会将他们重定向到 home.php。

我认为教师表的选择查询可能是这样的:

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

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

               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();
}
      }
4

2 回答 2

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 的使用将为您节省大量的数据库和代码时间。查看关系表、“角色”的概念和清理用户输入。由此,您可以以一种有意义的方式构建用户系统。

于 2012-11-22T00:28:40.650 回答
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');

设置会话变量后。

于 2012-11-22T00:32:24.267 回答