2010-08-04 41 views
0

我正在寫登錄腳本。我的db.php沒有回顯/打印任何東西,爲什麼沒有標題(「Location:index.php」);成功登錄後重定向?登錄信息是正確的。我知道我需要清理輸入,但目前這不是問題。爲什麼我的php重定向工作不成功?

<?php 
     require('db.php'); 
     $username = $_POST['un']; 
     $password = $_POST['pw']; 
     $qry="SELECT uid FROM users WHERE name='$username' AND pass='".md5($password)."'"; 
     $result=mysql_query($qry); 
     if(mysql_num_rows($result) == 1){ 
      session_regenerate_id(); 
      $user = mysql_fetch_assoc($result); 
      $_SESSION['S_UID'] = $user['uid']; 
      session_write_close(); 
      header("Location: index.php"); 
      exit(); 
     }else{ 
      echo "<center><form action='index.php' name='login'>Login failed! Please try again with correct username and password.<br><input type='submit' name='failed' value='Return to Login'></form></center>"; 
      exit(); 
     } 
    ?> 
+0

嘗試刪除'exit()'調用,看看它是否工作。 – NullUserException 2010-08-04 05:07:49

+0

取而代之的是什麼? – Artefacto 2010-08-04 05:08:06

+0

@NullUserException:出於什麼原因? – zerkms 2010-08-04 05:08:40

回答

2

只有在函數調用之前沒有腳本發送輸出時,函數標頭纔會起作用。檢查上面的代碼是否回顯了某些內容。

如果不是,請檢查上面的包含文件在關閉「?>」標記後是否沒有額外的空格或換行符。否則,這個空格或換行符將在您的標題之前發送到瀏覽器。

+0

我甚至沒有想到我的/關閉/ php標籤後的空白....我有一個。 – Dacto 2010-08-04 05:10:33

+0

對不起,如果我的記憶不對我失敗......如果有任何輸出已發送,並且您嘗試修改標頭,它將導致PHP引發異常...我認爲它必須是與他是URL的東西重定向到... – 2010-08-04 05:24:10

+0

我現在正在做的一種常見做法是徹底廢除最後一次PHP關閉「?>」。腳本仍然會運行,並且沒有額外空間的危險。 另一種方法是在文件的最頂端打開輸出緩衝。這將防止任何事件發送到瀏覽器直到處理結束(或至少直到調用ob_flush)。 – iWantSimpleLife 2010-08-06 02:04:46

0

您確定腳本(或db.php)中的任何位置都沒有生成輸出嗎?甚至沒有一些額外的空間?

+0

如果情況確實如此,他/她應該會收到錯誤(例如:已經發送的頭文件)。打開錯誤報告(例如:'error_reporting(E_ALL)') – NullUserException 2010-08-04 05:10:09

0

嘗試使用完整的URL,例如:

header("Location: http://www.mysite.com/index.php"); 

有些瀏覽器(IE感謝)不知道有未完成的URI 301重定向代碼。

在PHP這個頭位置的行爲是一個很好的工具,但很容易在不正確的情況下可以實現......爲此,我會考慮使用require()代替header(location)

,如:

if (!imLoggedIn()){ 
    require('loginForm.php'); 
    exit; 
}