通过AJAX调用的PHP header()无法正常工作

时间:2012-03-24 12:32:33

标签: php javascript mysql ajax

我是网络开发的新手。

现在我正在开发网站上的登录功能。我使用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);

4 个答案:

答案 0 :(得分:10)

我认为重定向不适用于AJAX。这将是会发生的事情:

  1. AJAX请求已发送至login.php
  2. login.php发送回Location: profile.php
  3. 标题
  4. 然后,浏览器会重定向并抓取profile.php
  5. 然后将profile.php的结果传递给您的XMLHttpRequest对象。
  6. 获取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