3

我正在尝试创建一个登录页面,该页面将根据用户的登录凭据将用户发送到不同的 index.php 页面。例如,如果具有“IT Technician”角色的用户登录,他们将被发送到“index.php”,如果具有“Student”角色的用户登录,他们将被发送到“student/index” .php”页面。

我看不出我的代码有什么问题,但它不起作用......每次按下登录按钮时,我都会收到“错误的登录凭据”消息。

我的用户登录页面代码在这里:

<?php
session_start();
if (isset($_SESSION["manager"])) {
header("location: http://www.zuluirminger.com/SchoolAdmin/index.php");
exit();
}
?>

<?php
if (isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["role"])) {
$manager = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["username"]);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password"]);
$role = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["role"]);
include "adminscripts/connect_to_mysql.php";
$sql = mysql_query("SELECT id FROM Users WHERE username='$manager' AND password='$password' AND role='$role' LIMIT 1");
$existCount = mysql_num_rows($sql);
if (($existCount == 1) && ($role == 'IT Technician')) {
    while ($row = mysql_fetch_array($sql)) {
        $id = $row["id"];
    }
    $_SESSION["id"] = $id;
    $_SESSION["manager"] = $manager;
    $_SESSION["password"] = $password;
    $_SESSION["role"] = $role;
    header("location: http://www.zuluirminger.com/SchoolAdmin/index.php");
} else {
    echo 'Your login details were incorrect. Please try again <a href="http://www.zuluirminger.com/SchoolAdmin/index.php">here</a>';
    exit();
}
}
?>

<?php
if (isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["role"])) {
$manager = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["username"]);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password"]);
$role = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["role"]);
include "adminscripts/connect_to_mysql.php";
$sql = mysql_query("SELECT id FROM Users WHERE username='$manager' AND password='$password' AND role='$role' LIMIT 1");
$existCount = mysql_num_rows($sql);
if (($existCount == 1) && ($role == 'Student')) {
    while ($row = mysql_fetch_array($sql)) {
        $id = $row["id"];
    }
    $_SESSION["id"] = $id;
    $_SESSION["manager"] = $manager;
    $_SESSION["password"] = $password;
    $_SESSION["role"] = $role;
    header("location: http://www.zuluirminger.com/SchoolAdmin/student/index.php");
} else {
    echo 'Your login details were incorrect. Please try again <a href="http://www.zuluirminger.com/SchoolAdmin/index.php">here</a>';
    exit();
}
}
?>

从中提取数据的形式如下所示:

<form id="LoginForm" name="LoginForm" method="post" action="http://www.zuluirminger.com/SchoolAdmin/user_login.php">
  User Name:<br />
  <input type="text" name="username" id="username" size="50" /><br />
  <br />

  Password:<br />
  <input type="password" name="password" id="password" size="50" /><br />
  <br />

  Log in as:
  <select name="role" id="role">
    <option value="">...</option>
<option value="Head">Head</option> 
<option value="Deputy Head">Deputy Head</option> 
<option value="IT Technician">IT Technician</option> 
<option value="Pastoral Care">Pastoral Care</option> 
<option value="Bursar">Bursar</option> 
<option value="Secretary">Secretary</option> 
<option value="Housemaster">Housemaster</option> 
<option value="Teacher">Teacher</option> 
<option value="Tutor">Tutor</option> 
<option value="Sanatorium Staff">Sanatorium Staff</option> 
<option value="Kitchen Staff">Kitchen Staff</option> 
<option value="Parent">Parent</option> 
<option value="Student">Student</option>
</select><br />
  <br />

  <input type="submit" name = "button" id="button" value="Log In" onclick="javascript:return validateLoginForm();" />
  </h3>
</form>

登录后(如果加载了正确的页面,我在脚本顶部的验证代码如下所示:

<?php
session_start();
if (!isset($_SESSION["manager"])) {
header("location: http://www.zuluirminger.com/SchoolAdmin/user_login.php");
exit();
}

$managerID = preg_replace('#[^0-9]#i', '', $_SESSION["id"]);
$manager = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["manager"]);
$password = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["password"]);
$role = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["role"]);

include "adminscripts/connect_to_mysql.php";
$sql = mysql_query("SELECT id FROM Users WHERE username='$manager' AND password='$password' AND role='$role' LIMIT 1");
$existCount = mysql_num_rows($sql);
if ($existCount == 0) {
header("location: http://www.zuluirminger.com/SchoolAdmin/index.php");
exit();
}
?>

请注意,数据库表具有以下字段:idusernamepasswordrole

任何帮助将不胜感激!

非常感谢,祖鲁语

4

3 回答 3

3

这是一个经典的调试情况,你可以暂时输出中间数据看看哪里出了问题。您可以对代码进行一些改进以使其更容易。

  • 在您的主登录页面中,您似乎连接到数据库两次,执行了SELECT两次,并执行了两次用户输入过滤。这是不必要的。将其减少到一个块 ​​- 它将使您的代码更加紧凑。
  • 与其将代码放在 mysql 函数中,我认为这样更好:

    $sql = "
        SELECT id FROM Users
        WHERE
            username='$manager'
            AND password='$password'
            AND role='$role'
        LIMIT 1
    ";
    //echo $sql; exit();
    mysql_query($sql);
    

现在您可以取消注释该echo行并查看 SQL 是否正确。手动对数据库运行它以检查,然后在您满意时将其删除。

  • 另外,看看我是如何缩进 SQL 字符串的?这种方式更具可读性。
  • header('Location: ...')ie 与大写的“L”一起使用。你的方式会奏效,但这种方式更正确。
  • 重定向后,始终执行exit(). 这是因为 PHP 将继续正常运行脚本,直到服务器意识到用户已断开连接 - 并且您希望对您的服务器友好:)
  • 您不需要重定向到完全限定的 URL。重定向到 很好"/SchoolAdmin/index.php",这将节省您硬连线您的网站地址。
  • $_POST在执行数据库操作之前,您不需要检查所有变量。这样做很好:

    if ($_POST) {
        // Form operation
    }
    

更整洁,做同样的事情!

  • 附录:不要在代码中引用诸如“IT 技术员”之类的值,而是define('ROLE_IT_TECH', 'IT Technician');在公共包含文件中使用。然后,您可以在登录代码登录表单中引用它,这样您就知道在所有用例中始终使用相同的值。
  • 附录 2:使用include_once而不是include,所以 PHP 会忽略任何重复的包含语句。
于 2012-04-09T17:16:58.673 回答
2

您必须在检查成功登录的地方重组 if() 语句:

if (($existCount == 1) && ($role == 'IT Technician'))

问题是,除非您使用正确的凭据和 IT 技术人员的角色登录,否则您将看到“错误登录”链接。您将永远无法获得学生或任何其他角色的代码。

您可以做的一件事是将 $existCount 和 $role 的检查分开。确保他们已正确登录。如果有,则使用一组 if() elseif() 语句或 select/case 来确定它们是哪个 $role 被重定向到适当的页面

伪代码

if ($existCount == 1) {

    if($role == 'IT Technician') {
        header(location1);
    }
    elseif($role == 'Student') {
        header(location2);
    }
    elseif(etc...) {
        header(location3);
    }
}
于 2012-04-09T17:15:49.953 回答
2

每次运行代码时,您都会点击此部分,因为您正在执行 if else

if (($existCount == 1) && ($role == 'IT Technician')) {
}
else {
     echo 'Your login details were incorrect. Please try again <a href="http://www.zuluirminger.com/SchoolAdmin/index.php">here</a>';
exit();
}

每次运行您的代码并且您的角色不是 IT 技术员时,您都会发送一条错误消息并完全停止应用程序……无论它是学生、疣猪还是没有角色。

尽管有很多需要改进的地方,但最初我建议删除重复的部分(IT 管理员与学生),而是从数据库中检索该行,而不是让用户提交它。

SELECT id FROM Users WHERE username='$manager' AND password='$password' LIMIT 1

if ( count($sql) == 1 ) {
     if ( $sql['role'] == 'IT Adminstrator' ) {
          header('admin_url.php');
     } elseif ( $sql['role'] == 'Student' ) {
          header('student_url.php');
     };
};
于 2012-04-09T17:17:18.307 回答