我是网络开发的新手。
现在我正在开发网站上的登录功能。我使用Javascript / AJAX获取用户名和密码,并将其发送到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);
答案 0 :(得分:10)
我认为重定向不适用于AJAX。这将是会发生的事情:
login.php
login.php
发送回Location: profile.php
profile.php
profile.php
的结果传递给您的XMLHttpRequest对象。获取AJAX响应以重定向页面的方法是:
来自login.php
的响应会返回一个JSON响应,其中包含状态代码(302或301)以及要重定向到的位置。
响应本身的状态代码为200(成功)。
JSON响应过程并检查302或301的状态代码并重定向到该位置。
答案 1 :(得分:3)
你需要在header()之前取出echo语句。如果在调用之前已将任何内容输出到浏览器,则标题将不起作用。
这是php doc。
答案 2 :(得分:0)
到底发生了什么?
在php中调用header()
之后,php仍会执行脚本的其余部分,除非在exit;
调用后粘贴header()
。仅当您不想执行剩余的login.php
答案 3 :(得分:0)
您可以用header("Location: profile.php");
替换代码echo "window.location.href='profile.php';
,并将您的成功函数替换为
if(obj.status == 200) { eval(obj.responseText); }
多数民众赞成。现在,响应将通过脚本进行评估,并将页面重定向到profile.php