将错误消息添加到 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 attempt2 = 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 已弃用。请改用 MySQLiPDO。这也非常重要。
  • 另外,请开始使用 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 耦合确保不会发生这种类型的溢出。