php:如何重定向到带有错误消息的同一页面

Posted

技术标签:

【中文标题】php:如何重定向到带有错误消息的同一页面【英文标题】:php: How can I redirect to the same page with a error message 【发布时间】:2020-10-12 10:47:45 【问题描述】:

当输入的电子邮件不包含 @ 符号时,我需要重定向到同一页面。其余代码正在运行,但每当我发送一封没有@ 的电子邮件时,它都会将我重定向到一个空白页面。 (问题详情如下: 登录屏幕需要对其输入数据进行一些错误检查。如果名称或密码字段为空,则应显示以下格式的消息:

需要邮箱和密码

请注意,我们使用“电子邮件”而不是“用户名”来登录此作业。

如果密码不为空且不正确,您应该提出以下形式的消息:

密码错误

对于此分配,您必须添加一个新验证以确保登录名包含一个 at 符号 (@) 并在这种情况下发出错误:

电子邮件必须有一个 at 符号 (@)

如果传入的密码经过正确哈希处理,与存储的 stored_hash 值匹配,则用户的浏览器将重定向到 autos.php 页面,并使用用户名作为 GET 参数:

header("位置:autos.php?name=".urlencode($_POST['who']));

您还必须使用 error_log() 函数在用户由于密码错误导致登录失败时发出以下消息,其中显示了密码和盐的计算哈希值:

error_log("登录失败 ".$_POST['who']." $check");

登录成功时(即哈希匹配)发出以下日志消息:

error_log("登录成功".$_POST['who']); )

<?php 

if ( isset($_POST['cancel'] ) ) 
    header("Location: index.php");
    return;


$salt = 'XyZzy12*_';
$stored_hash = '1a52e17fa899cf40fb04cfc42e6352f1';  

$failure = false;  


// Check to see if we have some POST data, if we do process it
if ( isset($_POST['email']) && isset($_POST['pass']) ) 
    if ( strlen($_POST['email']) < 1 || strlen($_POST['pass']) < 1 ) 
        $failure = "Email and password are required";
     else 
        if(strpos($_POST['email'], '@') !== false)
        
            $check = hash('md5', $salt.$_POST['pass']);
            if ( $check == $stored_hash ) 
                // Redirect the browser to autos.php
                header("Location: autos.php?name=".urlencode($_POST['email']));
                error_log("Login success ".$_POST['email']);
                return;
             else 
                $failure = "Incorrect password";
                error_log("Login fail ".$_POST['email']." $check");
                         
        
        else
        
            $failure = "Email must have an at-sign @";
            return;
        

    


// Fall through into the View
?>
<!DOCTYPE html>
<html>
<head>
<?php require_once "bootstrap.php"; ?>
<title>ANIK CHAKRABORTI</title>
</head>
<body>
<div class="container">
<h1>Please Log In</h1>
<?php
// Note triple not equals and think how badly double
// not equals would work here...
if ( $failure !== false ) 
    // Look closely at the use of single and double quotes
    echo('<p style="color: red;">'.htmlentities($failure)."</p>\n");

?>
<form method="POST">
<label for="nam">Email</label>
<input type="text" name="email" id="nam"><br/>
<label for="id_1723">Password</label>
<input type="text" name="pass" id="id_1723"><br/>
<input type="submit" value="Log In">
<input type="submit" name="cancel" value="Cancel">
</form>

</div>
</body>

【问题讨论】:

请不要自己滚动密码哈希,特别是不要使用MD5()SHA1()。 PHP 提供了password_hash()password_verify(),为了您的用户的安全,请使用它们。 【参考方案1】:

$failure = "Email must have an at-sign @" 行之后的 else 块中删除 return

我认为,在不知道如何处理请求的情况下,根据验证失败的示例,该过程不能返回。它只会在成功时返回,因为在这种情况下你会有一个新的标题,所以当页面加载时它会把你带到某个地方,失败时你只需要更改 $failure 变量就可以了。

【讨论】:

为什么我投了反对票?我的回答是正确的,并清除了@Anik 的错误。我自己试过了,它奏效了。请不要仅仅因为我澄清我不知道 Anik 的完整配置而投反对票。好伤心:(

以上是关于php:如何重定向到带有错误消息的同一页面的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 调用中的 PHP 重定向

带有自定义错误消息的 Django 重定向

输出消息后如何使用标头重定向到php中的另一个页面?

重定向到同一页面php后避免表单重新提交[重复]

php将两个角色重定向到同一页面

如果发生数据库错误,如何将页面重定向到其他页面