我是web开发的新手。
现在我正在一个网站上开发登录功能。我使用Javascript/AAJAX获取用户名和密码,并将其发送到一个PHP文件中,以便在MYSQL数据库上进行验证。这就是我要做的。
我的问题是为什么header()函数不能正常工作?我想在用户登录后,她被重定向到配置文件页面(profile.php)
以下是PHP(login.PHP)的片段:
$query = "SELECT * from user WHERE username = '$uname' AND password = md5('$pass');";
$ret = mysql_query($query) or die(mysql_error());
if(!$ret) {
$msg = "Invalid query " . mysql_error() . "'n";
$msg .= "Whole query " . $query;
die($msg);
}
$userid = -1;
while($row = mysql_fetch_array($ret)) {
$userid = $row["ID"];
}
$cnt = mysql_num_rows($ret);
if($cnt == 1) {
session_start();
$_SESSION["userid"] = $userid;
$_SESSION["uname"] = $uname;
echo "You have logged in successfully!";
header("Location: profile.php");
} else {
echo "Wrong Username/Password";
}
下面是Javascript(AJAX函数):
var obj;
var url = "login.php";
var params = "uname=" + document.getElementsByName("uname")[0].value + "&pass=" + document.getElementsByName("pass")[0].value;
if(window.XMLHttpRequest) { // Major browsers
obj = new XMLHttpRequest();
obj.open("POST",url,true);
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
obj.setRequestHeader("Content-length", params.length);
obj.setRequestHeader("Connection", "close");
obj.onreadystatechange = function() {
if(obj.readyState == 4) {
if(obj.status == 200) {
// success
} else {
alert("Problem in returned data" + "Error status=" + obj.status);
}
}
}
obj.send(params);
我不认为重定向将与AJAX一起工作。这就是将要发生的事情:
- AJAX请求发送到
login.php
login.php
发送回具有Location: profile.php
的报头- 然后浏览器重定向并获取
profile.php
profile.php
的结果随后被传递给XMLHttpRequest对象
获取AJAX响应重定向页面的一种方法是:
-
来自
login.php
的响应返回一个JSON响应,其中包含状态代码(302或301)和重定向到的位置。 -
响应本身的状态代码为200(成功)。
-
处理JSON响应并检查302或301的状态代码,然后重定向到该位置。
您需要在header()之前取出echo语句。如果在调用标头之前已经将任何内容输出到浏览器,则标头将不起作用。
这是关于它的php文档。
到底发生了什么?
在php中调用header()
之后,php仍然执行脚本的其余部分,除非在header()
调用之后粘贴exit;
。这只是当您不想执行login.php
的其余部分时
您可以将代码header("Location: profile.php");
替换为echo "window.location.href='profile.php';
,并将成功函数替换为
if(obj.status==200){eval(obj.responseText);}
就是这样。现在,脚本将评估响应,并在profile.php上重定向您的页面。