将错误消息添加到 PHP 登录页面
Add error message to PHP login page
我是PHP的新手,所以请温柔点...
我在 Dreamweaver 中创建了一个 PHP 登录页面,并将登录失败设置为 return 到同一页面,但想显示一条消息说 "username or password are incorrect" .
数据存储在 MySQL 数据库中
这是 Dreamweaver 生成的代码:
if (!isset($_SESSION)) {
session_start();
}
$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
$_SESSION['PrevUrl'] = $_GET['accesscheck'];
}
if (isset($_POST['email'])) {
$loginUsername=$_POST['email'];
$password=$_POST['password'];
$MM_fldUserAuthorization = "";
$MM_redirectLoginSuccess = "bac123_update_details.php";
$MM_redirectLoginFailed = "bac123.php";
$MM_redirecttoReferrer = true;
mysql_select_db($database_connRespond, $connRespond);
$LoginRS__query=sprintf("SELECT email, password FROM customer WHERE email=%s AND password=%s",
GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text"));
$LoginRS = mysql_query($LoginRS__query, $connRespond) or die(mysql_error());
$loginFoundUser = mysql_num_rows($LoginRS);
if ($loginFoundUser) {
$loginStrGroup = "";
if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();}
//declare two session variables and assign them
$_SESSION['MM_Username'] = $loginUsername;
$_SESSION['MM_UserGroup'] = $loginStrGroup;
if (isset($_SESSION['PrevUrl']) && true) {
$MM_redirectLoginSuccess = $_SESSION['PrevUrl'];
}
header("Location: " . $MM_redirectLoginSuccess );
}
else {
header("Location: ". $MM_redirectLoginFailed );
}
}
如果登录失败,您将以这种方式重定向:
else {
header("Location: ". $MM_redirectLoginFailed );
}
这里声明了哪个变量:
$MM_redirectLoginFailed = "bac123.php";
因此您应该检查文件 "back123.php" 并根据需要进行更改。
我还建议在任何 header 调用后退出:
header("Location: ". $MM_redirectLoginFailed );
exit();
有几种方法可以做到这一点。
1) 您可以使用 URL 变量,例如
login.php?message=1
而login.php脚本可以检查if($_GET['message'] == 1){...}
,然后根据你给它的代码编号输出一条消息,如1 = failed attempt
、2 = logged out ok
等。
2) 如果你对session有经验的话可以使用$_SESSION
验证,这很简单,如果没有,请花点时间学习和理解session , 它们 在 PHP 中非常 有用。
在您的代码页上,您可以设置一条消息,例如:
$_SESSION['msg'] = "Your username or password are incorrect";
header("Location: login.php");
exit;
与第 1 点类似,您可以设置一个 IF
语句,例如:
if(!empty($_SESSION['msg'])){
/***
output the session message to the browser.
***/
print $_SESSION['msg'];
unset($_SESSION['msg']); //clear the message once it's been output.
}
一些重要说明:
- 密码应作为 HASHED 值存储在数据库中,使用类似 password_hash 的东西。这是非常重要的。
- MySQL 已弃用。请改用
MySQLi
或 PDO
。这也非常重要。
- 另外,请开始使用 Prepared Statements 进行 SQL 查询。
- 每次
header("location:...);
调用你 really 后,really 应该使用 exit;
或 die();
语句停止 PHP 代码执行(如上例)。
编辑:
header("Location: ...");
重定向后应使用退出的原因。
这是因为 PHP 不会仅仅因为到达 header
命令就停止 运行 页面脚本,即使它确实将命令识别为 Redirect (Location:
),脚本不会停止,所以如果你有一个 header
这是一个位置重定向,你假设页面将在此时停止并重定向本身,这是错误的。
该页面仍将执行代码,进一步向下可以更改数据值/数据库值,甚至可以 运行 进入额外的 headers 与额外的位置重定向,这将 覆盖 原始(预期)位置重定向。如果有任何输出(例如 header 下面有 HTML 输出),重定向也将被取消。
示例:
//processing a user login...
if(failed == true){
header("Location:loginagain.php");
}
header("Location:welcome.php");
以上代码示例问题;即使登录失败并且 IF 语句 returns TRUE,用户仍然可以访问 welcome.php
页面。
因此 header
/ exit
耦合确保不会发生这种类型的溢出。
我是PHP的新手,所以请温柔点...
我在 Dreamweaver 中创建了一个 PHP 登录页面,并将登录失败设置为 return 到同一页面,但想显示一条消息说 "username or password are incorrect" .
数据存储在 MySQL 数据库中 这是 Dreamweaver 生成的代码:
if (!isset($_SESSION)) {
session_start();
}
$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
$_SESSION['PrevUrl'] = $_GET['accesscheck'];
}
if (isset($_POST['email'])) {
$loginUsername=$_POST['email'];
$password=$_POST['password'];
$MM_fldUserAuthorization = "";
$MM_redirectLoginSuccess = "bac123_update_details.php";
$MM_redirectLoginFailed = "bac123.php";
$MM_redirecttoReferrer = true;
mysql_select_db($database_connRespond, $connRespond);
$LoginRS__query=sprintf("SELECT email, password FROM customer WHERE email=%s AND password=%s",
GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text"));
$LoginRS = mysql_query($LoginRS__query, $connRespond) or die(mysql_error());
$loginFoundUser = mysql_num_rows($LoginRS);
if ($loginFoundUser) {
$loginStrGroup = "";
if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();}
//declare two session variables and assign them
$_SESSION['MM_Username'] = $loginUsername;
$_SESSION['MM_UserGroup'] = $loginStrGroup;
if (isset($_SESSION['PrevUrl']) && true) {
$MM_redirectLoginSuccess = $_SESSION['PrevUrl'];
}
header("Location: " . $MM_redirectLoginSuccess );
}
else {
header("Location: ". $MM_redirectLoginFailed );
}
}
如果登录失败,您将以这种方式重定向:
else {
header("Location: ". $MM_redirectLoginFailed );
}
这里声明了哪个变量:
$MM_redirectLoginFailed = "bac123.php";
因此您应该检查文件 "back123.php" 并根据需要进行更改。
我还建议在任何 header 调用后退出:
header("Location: ". $MM_redirectLoginFailed );
exit();
有几种方法可以做到这一点。
1) 您可以使用 URL 变量,例如
login.php?message=1
而login.php脚本可以检查if($_GET['message'] == 1){...}
,然后根据你给它的代码编号输出一条消息,如1 = failed attempt
、2 = logged out ok
等。
2) 如果你对session有经验的话可以使用$_SESSION
验证,这很简单,如果没有,请花点时间学习和理解session , 它们 在 PHP 中非常 有用。
在您的代码页上,您可以设置一条消息,例如:
$_SESSION['msg'] = "Your username or password are incorrect";
header("Location: login.php");
exit;
与第 1 点类似,您可以设置一个 IF
语句,例如:
if(!empty($_SESSION['msg'])){
/***
output the session message to the browser.
***/
print $_SESSION['msg'];
unset($_SESSION['msg']); //clear the message once it's been output.
}
一些重要说明:
- 密码应作为 HASHED 值存储在数据库中,使用类似 password_hash 的东西。这是非常重要的。
- MySQL 已弃用。请改用
MySQLi
或PDO
。这也非常重要。 - 另外,请开始使用 Prepared Statements 进行 SQL 查询。
- 每次
header("location:...);
调用你 really 后,really 应该使用exit;
或die();
语句停止 PHP 代码执行(如上例)。
编辑:
header("Location: ...");
重定向后应使用退出的原因。
这是因为 PHP 不会仅仅因为到达 header
命令就停止 运行 页面脚本,即使它确实将命令识别为 Redirect (Location:
),脚本不会停止,所以如果你有一个 header
这是一个位置重定向,你假设页面将在此时停止并重定向本身,这是错误的。
该页面仍将执行代码,进一步向下可以更改数据值/数据库值,甚至可以 运行 进入额外的 headers 与额外的位置重定向,这将 覆盖 原始(预期)位置重定向。如果有任何输出(例如 header 下面有 HTML 输出),重定向也将被取消。
示例:
//processing a user login...
if(failed == true){
header("Location:loginagain.php");
}
header("Location:welcome.php");
以上代码示例问题;即使登录失败并且 IF 语句 returns TRUE,用户仍然可以访问 welcome.php
页面。
因此 header
/ exit
耦合确保不会发生这种类型的溢出。