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:如何重定向到带有错误消息的同一页面的主要内容,如果未能解决你的问题,请参考以下文章