2012-03-24 6 views
2

私はWeb開発を初めて使いました。AJAX経由で呼び出されたPHPヘッダ()が正しく動作しません。

今、私はサイトのログイン機能に取り組んでいます。私はJavascript/AJAXを使用してユーザー名とパスワードを取得し、それをPHPファイルに送信してMYSQLデータベースで検証しました。それは私がしようとしていることです。

私の質問はなぜheader()関数が正しく機能しないのですか?

$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機能)のためだ:私は彼女がプロフィールページにリダイレクトされ、ユーザログイン(profile.php)

はここでPHP(login.php)の抜粋だ後にしたいです:

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オブジェクトはプロパティーを持っていますので、ステータスと読み取り値を確認する必要はありません:) – user3105607

答えて

10

リダイレクトはAJAXではうまくいかないと思います。これには何が起こるかです:

  1. AJAX要求をlogin.php
  2. login.phpに送信され Location: profile.php
  3. ブラウザでヘッダを送り返し、その後profile.phpの結果は、その後、あなたに渡されリダイレクトしprofile.php
  4. をフェッチXMLHttpRequestオブジェクト。

ページをリダイレクトするためにAJAXの応答を取得する方法はこれを行うことである。

  • login.php戻りステータスコード(302または301)を含むJSON応答と場所からの応答にリダイレクトする。

  • 応答自体のステータスコードは200(正常)です。

  • 処理はJSON応答で、302または301のステータスコードをチェックし、その場所にリダイレクトします。

+0

Javascriptでリダイレクトを行う必要があることを意味しましたか? – badcoder

+0

はい、それは正しいです:) – F21

+0

あなたの解決に大丈夫です – badcoder

0

何が起こっているのですか?

header()がphpで呼び出された後、header()コールの後にexit;を貼り付けない限り、PHPは残りのスクリプトを実行します。これは残りの部分を実行したくない場合にだけですlogin.php

+0

奇妙なことに、ログインページのHTMLスクリプトを表示するポップアップウィンドウが開きます。 PHP)。そして、コードの最後の行であるlogin.phpのために、私は終了が必要とは思わない。 – badcoder

2

header()の前にecho文を取り出す必要があります。呼び出される前に何かがブラウザに出力されていれば、ヘッダは機能しません。

ここにはphp docがあります。

0

あなたは一つのことheader("Location: profile.php");echo "window.location.href='profile.php';であなたのコードを交換し、それ

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

ザッツとしてあなたの成功の機能を置き換えることができます。レスポンスはスクリプトによって評価され、あなたのページをプロフィールにリダイレクトします。PHP

関連する問題