将错误信息添加到PHP登录页面


Add error message to PHP login page

我是PHP新手,所以请温柔…

我在Dreamweaver中创建了一个PHP登录页面,并将登录失败设置为返回到同一页面,但希望显示一条消息说"用户名或密码不正确"。

数据存储在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 );
  }
}

有几种方法可以做到。

1)您可以使用URL变量,如

下吗?消息= 1

login.php脚本可以检查if($_GET['message'] == 1){...},然后输出与您给它的代码编号相对应的消息,如1 = failed attempt, 2 = logged out ok等。

2)如果你有会话经验,你可以使用$_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.
}

注意事项:

  • 密码应该在数据库中存储为哈希值,使用类似password_hash的东西。这是非常重要的。
  • MySQL已弃用。使用MySQLiPDO代替。这也是非常重要的。
  • 也请开始使用准备语句为您的SQL查询。
  • 在每次调用header("location:...);之后,really应该用exit;die();语句停止PHP代码的执行(如上所示)。

编辑:

header("Location: ...");重定向后使用exit的原因

这是因为PHP不会因为到达header命令而停止运行页面脚本,即使它确实将该命令识别为重定向 (Location:),脚本也不会停止,所以如果您有一个header,这是一个位置重定向,并且您认为页面将在此时停止并重定向自己,这是错误的。

页面仍然会执行代码,这进一步可以改变数据值/数据库值,甚至可以运行到额外的头与额外的位置重定向,这将覆盖原来的(预期的)位置重定向。如果有任何输出(例如标题下面有HTML输出),重定向也将被取消。

例子:

//processing a user login...
if(failed == true){
    header("Location:loginagain.php");
}
header("Location:welcome.php");

上面的代码示例问题;即使登录失败并且if语句返回TRUE,用户仍然能够到达welcome.php页面。

所以header/exit耦合确保了这种类型的溢出不会发生

在登录失败的情况下,您可以这样重定向:

else {
  header("Location: ". $MM_redirectLoginFailed );
}

这里声明的变量:

$MM_redirectLoginFailed = "bac123.php";

所以你应该检查文件"back123.php"并根据你的需要修改它。

我还建议在任何头文件调用后退出:

header("Location: ". $MM_redirectLoginFailed );
exit();