session_start () и массив $ _SESSION, и совпадают логин с объектом в массив - PullRequest
0 голосов
/ 30 октября 2011

Я пытаюсь заставить процессор входа в систему совпадать с тем, что вводит пользователь, с массивом жестко закодированных объектов, который содержит имя, фамилию и пароль.Я не уверен, как сделать проверку между логином и массивом объектов.У меня есть 3 страницы: student.class.php, login.php и processor.php.

Мне также нужно использовать массивы session_start () и $ _SESSION, но я не уверен, как реализовать это вмой проект.я бы сделал отдельный файл сеанса или включил его в свой процессор.

Student.class.php

<?php

class Student 
{

    private $f_name;
    private $l_name;
    private $full_name;
    private $password;

    //Constructor method
    public function __construct($f_name,$l_name,$password) {
        $this->f_name = $f_name;
        $this->l_name = $l_name; 
        $this->password = $password;
    }



    function get_name(){
        $full_name = $this->f_name.' '.$this->l_name;
        return $full_name;
    }

    function get_level(){
        return $this->level;
    }

    function get_gender(){
        return $this->gender;
    }

    function get_password(){
        return $this->password;
    }
}
?>

login.php

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>

    <body>
    <?php

    require_once 'student.class.php';

    $students = array();

    $students[0] = new Student('Trey', 'Smith', 'senior', 'male', 'sailor1234');
    $students[1] = new Student('Kyle', 'McAulay', 'junior', 'male', 'abc123');
    $students[2] = new Student('Stacey', 'Keibler','senior','female', 'hotdawg23');
    $students[3] = new Student('Lindsey', 'Mullins', 'junior','female','gonoles69');
    $students[4] = new Student('Kenneth', 'Jaggers','senior', 'male', 'peterpanpan');
    $students[5] = new Student('Chad', 'Endris', 'sophomore', 'male','back2thefuture');

    ?>

    <h1>Sign up for our site!</h1>
    <form method="post" action="processor.php">     
        <fieldset>          
            <label>First Name</label>
            <input type="text" name="first_name"/>

            <label>Last Name</label>
            <input type="text" name="last_name"/>

            <label>Password</label>
            <input type="text" name="password"/>                    
        </fieldset>

        <br><input type="submit" value="Submit"></input></br>
     </body>
</html>

processor.php

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>

    <body>

    <?php

    require_once 'student.class.php';
    require_once 'login.php';

    function check_submit($field_to_check)
    {
        if (isset($_POST[$field_to_check]) && $_POST[$field_to_check] != '')
        {
            return TRUE;
        }
        else
        {
            return "Please fill in the $field_to_check category!";
        }
    }


    $errors = array();

    $_POST['first_name'] = strip_tags(trim($_POST['first_name']));
    $_POST['last_name'] = strip_tags(trim($_POST['last_name']));
    $_POST['password'] = strip_tags(trim($_POST['password']));


    if (check_submit('first_name') !== TRUE)
    {
        $errors[] = check_submit('first_name');
    }

    if (check_submit('last_name') !== TRUE)
    {
        $errors[] = check_submit('last_name');    
    }

    if (check_submit('password') !== TRUE)
    {
        $errors[] = check_submit('password');    
    }

    if (count($errors)> 0){
        echo "<ul>";
        foreach($errors as $message){
        echo "<li>$message</li>";
    }

    echo "</ul>";

    die();
    }

    ?>

    <h1>Thank you for registering <?php echo $_POST['first_name']."
    ".$_POST['last_name']?>!</h1>
    <h2>Your password was correct!</h2>

    </body>
</html>

Ответы [ 2 ]

1 голос
/ 30 октября 2011

Поместите session_start () в верхней части любой страницы, которая вам нужна для установки / получения данных сеанса.

После входа в систему, просматривайте массив ваших студентов, проверяя каждый из них на ваши входные данные $ _POST.Если вы получите совпадение, сохраните объект в переменной сеанса, такой как $ _SESSION ['student']

foreach ($students as $student) {

    if ($student->f_name == $_POST['f_name'] &&
        $student->l_lame == $_POST['l_lame'] &&
        $student->password == $_POST['password'] ) {

        $_SESSION['student'] = $student;
        break;

    }

}

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

Кроме того, в файле processor.php вы ищете $ _POST ['first_name'], но имя вводаполе 'f_name'

0 голосов
/ 30 октября 2011

Прежде всего, жестко запрограммированный массив должен находиться в файле processor.php, где вы фактически проверяете учетные данные пользователя, а не в файле login.php, который просто отображает форму входа.Затем вы должны каким-то образом обойти массив студентов и проверить, является ли то, что набрал пользователь, допустимым.Но сначала давайте добавим небольшую удобную функцию в Student.php

class Student {
    function checkCredentials($firstname, $lastname, $password) {
        $firstname = strip_tags(trim($firstname));
        $lastname  = strip_tags(trim($lastname));
        $password  = strip_tags(trim($password));

        if(
            $this->f_name == $firstname
            && $this->l_name == $lastname
            && $this->password == $password
        ) {
            return true;
        }

        return false;       
    }
}

Обратите внимание, что я переместил очистку ввода в класс.И теперь мы можем немного изменить файл CPU.php:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>

    <body>

    <?php

    function check_submit($field_to_check)
    {
        if (isset($_POST[$field_to_check]) && $_POST[$field_to_check] != '')
        {
            return TRUE;
        }
        else
        {
            return "Please fill in the $field_to_check category!";
        }
    }

    if (check_submit('first_name') !== TRUE)
    {
        $errors[] = check_submit('first_name');
    }

    if (check_submit('last_name') !== TRUE)
    {
        $errors[] = check_submit('last_name');    
    }

    if (check_submit('password') !== TRUE)
    {
        $errors[] = check_submit('password');    
    }


    if (count($errors)> 0){
        echo "<ul>";
        foreach($errors as $message){
            echo "<li>$message</li>";
        }
        echo "</ul>";       
        die();
    }               

    // so far we've only checked if the post values exist

    require_once "student.class.php";

    $students = array();

    $students[0] = new Student('Trey', 'Smith', 'senior', 'male', 'sailor1234');
    $students[1] = new Student('Kyle', 'McAulay', 'junior', 'male', 'abc123');
    $students[2] = new Student('Stacey', 'Keibler','senior','female', 'hotdawg23');
    $students[3] = new Student('Lindsey', 'Mullins', 'junior','female','gonoles69');
    $students[4] = new Student('Kenneth', 'Jaggers','senior', 'male', 'peterpanpan');
    $students[5] = new Student('Chad', 'Endris', 'sophomore', 'male','back2thefuture');

    $user = false; // Will store the logged in user, if login succeeds

    // Here we traverse the array and checkCredentials for each stored Student object
    foreach($students as $student) {

        if($student->checkCredentials($_POST["first_name"], $_POST["last_name"], $_POST["password"]) {                      
            $user = $student;
            break; // Since there can be only one logged in user, there is no point to let foreach continue
        }
    }

    if($user == false) {
        echo "No such user exits";
        die();
    }                           

    ?>

    <h1>Thank you for registering <?php echo $user->get_name; ?> !</h1> 
    <h2>Your password was correct!</h2>

    </body>
</html>

Наиболее распространенный подход для успешного входа в систему - это сохранение некоторой идентификации пользовательской информации (чаще всего userID) в переменной сеанса и перенаправление назащищенная страница.Поскольку это невозможно с вашим жестко закодированным массивом, я просто помещу весь объект в сессию.Это очень грубо и небезопасно, вам стоит подумать о добавлении базы данных в смесь.

Давайте назовем эту страницу admin.php, и конец файла process.php станет:

    if($user == false) {
        echo "No such user exits";
        die();
    }                           

    $_SESSION["user"] = $user;

    header("Location: admin.php");
    die();

admin.php должен выглядеть примерно так:

<?php

session_start();

require_once "student.class.php";   

if(
    !isset($_SESSION["user"])
    || !( $_SESSION["user"] instanceof Student)
) {
    header("Location: login.php");
    die();
}

$user = $_SESSION["user"];  

?>

<h1>Thank you for registering <?php echo $user->get_name; ?> !</h1> 
<h2>Your password was correct!</h2> 

Итак, что здесь происходит:

  • session_start () сообщает php, что вы хотите использовать сеансы, и это должно быть в каждом скрипте, которыйиспользует их, прежде чем вывести что-либо на экран (т. е. в самом верху скрипта, перед любым HTML).Вы также должны поместить его в processor.php
  • , прежде чем разрешить пользователю что-либо делать в admin.php. Мы проверяем, была ли инициализирована переменная $ _SESSION ["user"] и содержит ли она объект Student * 1020.*
  • если нет, мы отправили пользователя обратно в логин.
  • если да, мы помещаем объект Student в симпатичную переменную, с которой можно поиграться.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...