第一次正确加载表单,但在更正错误后重新提交时无法正确加载
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
部分理想情况下来自某个变量以保持其动态。)
我有一个名为 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
部分理想情况下来自某个变量以保持其动态。)