2012-12-26 64 views
0

我正在從數據庫中檢索數據以驗證用戶憑據。 如果密碼不匹配,我希望將用戶重定向到登錄頁面。 但是,這絕不會發生。相反,我被重定向到chat_main.php。標題(位置:URL)不起作用

它適用於所有其他情況(無效的電子郵件,有效的電子郵件和密碼組合)。

這裏是我的代碼:

<?php 
session_start(); 
require_once("config/db_connect.php"); 
$usr=$_POST['email']; 
$pwd=$_POST['password']; 
$q="SELECT * FROM userdata WHERE email=\"$usr\""; 
$info=mysql_query($q, $conn); 
if(mysql_num_rows($info)!=1){ 
    header("Location: login.php?err=1"); 
} 
else{ 
    while($data=mysql_fetch_array($info)){ 
     if($pwd!=$data['pwd']){ 
      header("Location: login.php?err=1"); 
     } 
     $usr=$_SESSION['username']=$data['fname']; 
     header("Location: chat_main.php?username=$usr"); 
    } 
} 
?> 

爲什麼表現如此,而且這可怎麼解決?

+0

發送'Location:'標題後終止腳本。 – DCoder

+1

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – Neal

回答

3

加入出口;在每個標題行之後,使腳本退出並實際處理標題重定向。否則,它將繼續運行,並會擊中下一個標頭重定向。

+0

它在代碼結束時退出,是的。但是它正在擊中下一個標題,這會使錯誤的密碼重定向失效。 – aynber

+1

@Neal - 是的,這裏有一個問題。在他發出第一個「頭文件」後,代碼繼續運行並執行第二個「頭文件」。這也可以通過將第二個'header'放在'else'中來解決。但使用'exit'可能是最好的選擇。 –

+0

@EricPetroelje第二個標題不應該被擊中!它是在其他部分! – Neal

0
<?php 
session_start(); 
require_once("config/db_connect.php"); 
$usr=$_POST['email']; 
$pwd=$_POST['password']; 
$q="SELECT * FROM userdata WHERE email=\"$usr\""; 
$info=mysql_query($q, $conn); 
if(mysql_num_rows($info)!=1){ 
header("Location: login.php?err=1"); 
exit; 
} 
else{ 
while($data=mysql_fetch_array($info)){ 
    if($pwd!=$data['pwd']){ 
     header("Location: login.php?err=1"); 
     exit; 
    } 
    $usr=$_SESSION['username']=$data['fname']; 
    header("Location: chat_main.php?username=$usr"); 
    exit; 
} 
} 
?> 

應該工作,因爲您必須在發送標頭後終止腳本。

+0

小心解釋你改進/改變了什麼?只是「應該工作」沒有提供很多學習曲線:) – Oldskool

+1

@Oldskool更新 – Disa

+0

@Disa ** Y您是否獲得良好空間?** – Neal