【问题标题】:PHP header() called via AJAX not working properly通过 AJAX 调用的 PHP header() 无法正常工作
【发布时间】:2012-03-24 12:32:32
【问题描述】:

我是网络开发新手。

现在我正在开发网站上的登录功能。我使用 Javascript/AJAX 获取用户名和密码并将其发送到 PHP 文件以在 MYSQL 数据库上进行验证。这就是我要做的。

我的问题是为什么 header() 函数不能正常工作?我希望在用户登录后将她重定向到个人资料页面(profile.php)

这里是 PHP 的 sn-p (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);

【问题讨论】:

  • XMLHttpRequest 对象有一个属性onload,所以你不必检查状态和就绪状态:)

标签: php javascript mysql ajax


【解决方案1】:

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

  1. AJAX 请求发送到login.php
  2. login.php 发回带有 Location: profile.php 的标头
  3. 然后浏览器重定向并获取profile.php
  4. profile.php 的结果随后会传递给您的 XMLHttpRequest 对象。

获取 AJAX 响应以重定向页面的一种方法是这样做:

  • 来自login.php 的响应返回一个 JSON 响应,其中包含状态代码(302 或 301)和重定向到的位置。

  • 响应本身的状态码为 200(成功)。

  • 处理 JSON 响应并检查 302 或 301 的状态代码并重定向到该位置。

【讨论】:

  • 您的意思是我必须在 Javascript 上进行重定向吗?
【解决方案2】:

需要在header()之前取出echo语句。如果在调用之前已将任何内容输出到浏览器,则标头将不起作用。

这是php doc

【讨论】:

    【解决方案3】:

    到底发生了什么?

    在 php 中调用 header() 之后,除非您在 header() 调用之后添加 exit;,否则 php 仍会执行脚本的其余部分。仅当您不想执行 login.php 的其余部分时才这样做@

    【讨论】:

    • 奇怪的是,它会打开一个弹出窗口,显示登录页面的 HTML 脚本(另一个称为 index.php 的页面)。对于 login.php,这是代码的最后一行,所以我认为没有必要退出。
    【解决方案4】:

    你可以用echo "window.location.href='profile.php';替换你的代码header("Location: profile.php");并将你的成功函数替换为

    如果(obj.status == 200){ 评估(obj.responseText); }

    就是这样。现在将通过脚本评估响应并将您的页面重定向到 profile.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多