2012-04-09 3 views
3

Я пытаюсь создать страницу входа, которая отправит пользователя на другую страницу index.php на основе их учетных данных. Например, если пользователь с ролью «ИТ-техник» входит в систему, они будут отправлены на «index.php», и если пользователь с ролью «Студент» войдет в систему, они будут отправлены в «ученик/индекс» .php ".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(); 
} 
?> 

Просто так вы известно, таблица базы данных имеет следующие поля: идентификатор, имя пользователя, пароль и роль.

Любая помощь была бы принята с благодарностью!

Большое спасибо, Zulu

+0

Вы вошли в систему как «ИТ-техник», используя учетную запись, которая на самом деле имеет эту роль? Вы проверили, что ваш запрос действительно возвращает одну строку? Возможно, у вас есть дублированные строки, поэтому он возвращает число строк в 2 вместо 1. –

+0

Я замечаю, что вы фильтруете SQL-инъекцию - отлично! Это наша любимая ошибка здесь ':)'. – halfer

+0

Нет повторяющихся строк, и данные, безусловно, находятся в таблице! И спасибо! Безопасность - одна из основных областей проекта :) –

ответ

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: ...'), т. Е. С верхним регистром 'L'. Ваш путь будет работать, но этот путь вернее.
  • После перенаправления всегда делайте exit(). Это связано с тем, что PHP будет продолжать нормально работать, пока сервер не поймет, что пользователь отключился - и вы хотите быть добрым к своему серверу :).
  • Вам не нужно перенаправлять на полностью определенный URL. Это нормально, чтобы перенаправить на "/SchoolAdmin/index.php", что сэкономит вам жесткой проводки ваш адрес веб-сайта.
  • Вам не нужно проверять все валы $_POST, прежде чем делать свою базу данных op. Это хорошо только, чтобы сделать это:

    if ($_POST) { 
        // Form operation 
    } 
    

Многое аккуратнее, и делает то же самое!

  • Приложение: вместо ссылки на такие значения, как «ИТ-техник» в вашем коде, используйте define('ROLE_IT_TECH', 'IT Technician'); в общем файле include. Затем вы можете ссылаться на него в своем логинном коде и в своей форме входа в систему, чтобы вы знали, что всегда используете одно и то же значение во всех прецедентах.
  • Addendum 2: используйте include_once, а не include, поэтому PHP игнорирует любые повторяющиеся утверждения include.
+0

Большое спасибо за ваш ответ. Поскольку я написал другому вкладчику, я пробовал это, и вместо того, чтобы получать сообщение «неправильные учетные данные», теперь он просто перенаправляет меня на страницу входа. Это (я думаю) означает, что мне теперь нужно настроить индексную страницу, чтобы она меня не выбрасывала. т.е. он регистрирует меня правильно, тогда страница, к которой он переходит, не распознает его ... Любые слова мудрости ?! Zulu –

+0

Ну, похоже, что в верхней части каждой страницы вы снова делаете логин. Нет необходимости - просто введите '$ _SESSION ['logged_in'] = true' назначение на странице входа, а затем проверьте это в начале каждой защищенной страницы. Намного легче! – halfer

+0

(Кстати, в Stack Overflow обычно не рекомендуется пересылать одно сообщение всем участникам - это немного похоже на спам. Направляйте свои конкретные вопросы пользователю, который больше всего тронул вашу новую проблему. Просто так вы знаете!) – halfer

2

Вы должны перестроить свой, если() заявление, в котором вы проверяете для успешной регистрации:

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

Вопрос заключается в том, что если вы не войти в систему с правильными учетными данными и о роли ИТ-специалиста вы увидите ссылку «Неправильный вход». Вы никогда не получите код для Студента или какую-либо другую роль.

Одна вещь, которую вы можете сделать, это разделить проверку на $ existCount и $ role. Убедитесь, что они вошли в систему правильно. Если у них есть, а затем использовать набор, если() ElseIf() заявления или выберите/случай, чтобы определить, какие $ роль они являются перенаправлять на соответствующую страницу

псевдокод

if ($existCount == 1) { 

    if($role == 'IT Technician') { 
     header(location1); 
    } 
    elseif($role == 'Student') { 
     header(location2); 
    } 
    elseif(etc...) { 
     header(location3); 
    } 
} 
+0

Для начинающих программистов я склонен советовать, что скобки всегда должны использоваться, поскольку это источник распространенных ошибок.Большинство руководств по стилю настаивают на этом в любом случае (например, PEAR). – halfer

+0

Большое спасибо за ваш ответ. Поскольку я написал другому вкладчику, я пробовал это, и вместо того, чтобы получать сообщение «неправильные учетные данные», теперь он просто перенаправляет меня на страницу входа. Это (я думаю) означает, что мне теперь нужно настроить индексную страницу, чтобы она меня не выбрасывала. т.е. он регистрирует меня правильно, тогда страница, к которой он переходит, не распознает его ... Любые слова мудрости ?! Zulu –

2

Вы ударяете этот раздел каждый ваш код работает, потому что вы делаете, если еще

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

Everytime код запускается и ваша роль не IT техник, то вы отправляете сообщение об ошибке и прекратить приложение полностью ... независимо от того, является ли это учеником, бородавочником или никакой ролью.

Несмотря на то, что есть много улучшений, изначально я предлагаю удалить дублированные разделы (IT Adminstrator vs Student) и вместо этого восстановить строку из базы данных, а не позволить пользователю отправить ее.

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'); 
    }; 
}; 
+0

Warthog, ha! ':)' – halfer

+0

@Gaurav Большое спасибо за ваш ответ. Я пробовал это, и вместо того, чтобы получать сообщение «неправильные учетные данные», теперь он просто перенаправляет меня на страницу входа. Это (я думаю) означает, что мне теперь нужно настроить индексную страницу, чтобы она меня не выбрасывала. т.е. он регистрирует меня правильно, тогда страница, к которой он переходит, не распознает его ... Любые слова мудрости ?! зулус –

Смежные вопросы