Форма загружается правильно в первый раз, но не после повторной отправки после исправления ошибок - PullRequest
0 голосов
/ 07 мая 2020

У меня есть класс контроллера с именем class Base_controler, который перенаправляет URL-адрес с первым индексом в $_GET['url'], являющимся именем класса, а вторым - методом в классе. Так что это полезно, допустим, у нас есть форма в from action="". Мне просто нужно ввести только две вещи: 1. Класс 2. Метод, который будет выполняться в этом классе. Также он показывает виды из папки просмотров. Возьмите следующую форму, например, если мне нужно отобразить ее из контроллера Users, мне просто нужно запустить loadView ('Users/login', $data) ($data - это любые данные, если я хочу передать в любое представление, если оставить поле пустым, оно передается как пустой массив).

<form action = "Users/login" method="POST">
<input type="text" placeholder="Enter username" name="username"><br>
<?php echo (!empty($data['username_error']) ? $data['username_error'] : '');?>
<input type="password" placeholder="Enter password" name="password"><br>
<?php echo (!empty($data['password_error']) ? $data['password_error'] : '');?>
<button type="submit" name="submit_login">Submit</button>
</form>

Обратитесь к контроллеру Users, где можно увидеть, что, если пользователь вводит какое-либо недопустимое значение, такое как имя пользователя или пароль, представление повторно отправляется пользователю с соответствующими ошибками.

<?php
class Users extends Base_controller{
public function login(){
// This method does both display and process the form
        // Load the form if it has not been submitted yet
        if(!isset($_POST['submit_login'])){
            $this->load_view('users/login');
        }

        // Process the form if it has been submitted
        elseif(isset($_POST['submit_login'])){
*Code has been cute here*
            if($this->password == 'Invalid username'){
                // Code to execute if the entered username does not exist in the database
                $data['username_error'] = 'Invalid username.';
            }

            else{
                // Code to execute if the entered username exists in the database
                var_dump($this->password);echo br;
                echo $this->password.br;
                if(password_verify($_POST['password'], $hashed_password_retrieved_from_db)){
                    // Code to execute if the entered password is valid
                    $this->valid_password = true;
                }
                else{
                    // Code to execute if the entered password is invalid 
                    $data['password_error'] = 'Invalid password.';
                }
            }

            // Code to check if any error(s) exist(s) and proceed accordingly
            if(empty($data['username_error']) && empty($data['password_error']) && $this->valid_password==true){
                // Code to execute if no errors are present

                // Create session
                session_start();
                $_SESSION['username'] = $_POST['username'];
                // Redirect user to dashboard
                header('location: dashboard');
            }

            // Code to execute if errors are present in the entered data: Reload the form with errors
            $this->load_view('users/login', $data);

        }
    }
}
?>

Теперь проблема в том, что если пользователь вводит какое-либо недопустимое поле, представление отправляется обратно пользователю с соответствующими ошибками для изменения неправильных полей, но когда пользователь повторно отправляет форму, только пустая страница загружается. Также я заметил еще одну вещь: когда форма загружается в первый раз или когда она была повторно отправлена ​​пользователю, в адресной строке написано - http://localhost/Users/login (как и должно быть, потому что я использую файл .htaccess для вырезания оставшаяся чушь), однако, когда форма была повторно отправлена, в адресной строке написано - http:///localhost/Users/Users/login. Это код, который я создал на основе учебника, в котором действие формы было http://localhost/Users/login. Какую ошибку я здесь делаю ????

1 Ответ

0 голосов
/ 07 мая 2020

Вы неправильно обрабатываете свои относительные пути.

В первый раз, когда вы отправляете это, текущий URL-адрес http://localhost/Users/login после этого - так что мы уже здесь в поддельной «папке» с именем Users.

Затем, когда вы отправляете это снова, браузер снова разрешает относительный URL Users/login из атрибута действия формы, комбинируя его с текущим абсолютным URL-адресом, http://localhost/Users/login.

То из Конечно, сейчас вы попадете на http://localhost/Users/Users/login.

Если все ваше приложение работает непосредственно под доменом root, то просто добавьте к нему префикс sla sh,

<form action="/Users/login" method="POST">

(если это было не так, и у вас это работало под каким-то базовым путем, настроенным где-то в настройках, тогда вам нужно будет добавить это также - action="/my-base-path/Users/login", причем часть my-base-path в идеале поступает из некоторой переменной, чтобы сохранить ее динамика c.)

...