2012-03-24 82 views
2

我是新開發的web開發人員。通過AJAX調用PHP header()無法正常工作

現在我正在使用網站上的登錄功能。我使用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

XMLHttpRequest對象有一個'onload'屬性,所以你不必檢查狀態和readystate :) – user3105607 2014-02-08 22:42:29

回答

10

我不認爲重定向將與AJAX工作。這是會發生什麼:

  1. AJAX請求被髮送到login.php
  2. login.php發回與Location: profile.php
  3. 然後將瀏覽器重定向並獲取一個頭,然後profile.php
  4. profile.php結果傳遞到您的XMLHttpRequest對象。

一種方式來獲得Ajax響應重定向你的網頁是這樣做:

  • login.php響應返回包含狀態代碼(302或301)和位置JSON響應重定向到。

  • 該響應本身的狀態碼爲200(成功)。

  • 處理JSON響應並檢查狀態碼302或301並重定向到該位置。

+0

你的意思是我必須在Javascript上做重定向嗎? – badcoder 2012-03-24 13:25:42

+0

是的,這是正確的:) – F21 2012-03-24 22:06:52

+0

好的感謝您的解決方案 – badcoder 2012-03-25 12:45:01

0

究竟發生了什麼?

在PHP中調用header()後,php仍會執行腳本的其餘部分,除非您在調用header()之後粘貼exit;。這只是如果你不想執行其餘的login.php

+0

奇怪的是,它打開一個彈出窗口,顯示登錄頁面的HTML腳本(另一頁稱爲索引。 php)。而對於login.php這是代碼的最後一行,所以我不認爲退出是必要的。 – badcoder 2012-03-24 12:49:48

2

您需要在header()之前取出echo語句。如果在調用瀏覽器之前已經將任何內容輸出到瀏覽器,則標題將無法使用。

這是php doc

0

您可以通過header("Location: profile.php");一個echo "window.location.href='profile.php';更換的東西你的代碼和替換您的成功起到

 
    if(obj.status == 200) { 
     eval(obj.responseText); 
    } 

完蛋了。現在,回覆將通過腳本進行評估,並將在配置文件中重定向您的頁面。php