第一次正确加载表单,但在更正错误后重新提交时无法正确加载

Form loads correctly the first time, but not when it has been resubmitted after rectifying the errors

我有一个名为 class Base_controler 的控制器 class,它重定向 url,$_GET['url'] 中的第一个索引是 class 名称,第二个是class 中的方法。所以这很有用,假设我们在 from action="" 中有一个表单,我只需键入两件事:1. class 2. 运行 中的方法 class.它还显示视图文件夹中的视图。以下面的形式为例,如果我必须从 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>

参考用户控制器,可以看出,如果用户输入任何无效值,如用户名或密码,视图将重新发送给用户并显示相应的错误。

<?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 的教程创建的代码。我在这里做错了什么????

您没有正确处理相对路径。

第一次提交时,当前 URL 之后是 http://localhost/Users/login - 所以我们已经在一个名为 Users 的假“文件夹”中了。

然后当你再次提交时,浏览器再次解析表单动作属性中的相对 URL Users/login,通过将它与当前的绝对 URL、http://localhost/Users/login.

这当然会让您现在 http://localhost/Users/Users/login

如果您的整个应用程序直接在域根目录下运行,则只需在其前面加上斜杠,

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

(如果情况并非如此,并且您在某处的设置中配置的某个基本路径下有此 运行,那么您也必须将其添加到 - action="/my-base-path/Users/login"my-base-path 部分理想情况下来自某个变量以保持其动态。)