我是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已弃用。使用
MySQLi
或PDO
代替。这也是非常重要的。 - 也请开始使用准备语句为您的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();