2012-10-25 19 views
-2

可能重複:
Headers already sent by PHPPHP登錄腳本頭已經發送出去

我試圖讓一個登錄腳本。這是我到目前爲止,但它返回時,我嘗試使用有效的用戶登錄:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/user/public_html/dir/login.php:3) in /home/user/public_html/dir/login.php on line 6 

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/user/public_html/dir/login.php:3) in /home/user/public_html/dir/login.php on line 6 

Warning: Cannot modify header information - headers already sent by (output started at /home/user/public_html/dir/login.php:3) in /home/user/public_html/dir/login.php on line 31 

這裏是我的代碼:

<?php 
if(isset($_POST['login'])){ 
ob_start(); 
session_start(); 
$host="xxx"; 
$username_db="xxx"; 
$password_db="xxx"; 
$db_name="xxx"; 
$tbl_name="xxx"; 

mysql_connect("$host", "$username_db", "$password_db")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

$email=$_POST['email']; 
$password=$_POST['password']; 

$email = stripslashes($email); 
$password = stripslashes($password); 
$email = mysql_real_escape_string($email); 
$password = mysql_real_escape_string($password); 
$sql="SELECT * FROM $tbl_name WHERE username='$email' and password='$password'"; 
$result=mysql_query($sql); 

$count=mysql_num_rows($result); 

if($count==1){ 
$_SESSION['username'] = $email; 
$_SESSION['password'] = $password; 
header("location:main.php"); 
} 
else { 
echo"<br><center><div class=\"alert alert-error\"> 
Wrong email or password!</div></center>"; 

} 
ob_end_flush(); 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Login</title> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 

    <link href="bootstrap/css/bootstrap.css" rel="stylesheet"> 
    <style type="text/css"> 
     html, body { 
     background-color: #eee; 


     } 
     body { 
     padding-top: 40px; 
     } 
     .container { 
     width: 300px; 
     } 

     .container > .content { 
     background-color: #fff; 
     padding: 20px; 
     margin: 0 -20px; 
     -webkit-border-radius: 10px 10px 10px 10px; 
      -moz-border-radius: 10px 10px 10px 10px; 
       border-radius: 10px 10px 10px 10px; 
     -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15); 
      -moz-box-shadow: 0 1px 2px rgba(0,0,0,.15); 
       box-shadow: 0 1px 2px rgba(0,0,0,.15); 
     } 

     .login-form { 
     margin-left: 65px; 
     } 

     legend { 
     margin-right: -50px; 
     font-weight: bold; 
     color: #404040; 
     } 

    </style> 

</head> 
<body> 


    <div class="navbar navbar-inverse navbar-fixed-top"> 
     <div class="navbar-inner"> 
     <div class="container"> 
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      </a> 
      <a class="brand" href="#">hi</a> 
      <div class="nav-collapse collapse"> 
      <ul class="nav"> 
       <li class="active"><a href="#">Home</a></li> 
       <li><a href="register.php">Register</a></li> 
       <li><a href="contact.php">Contact</a></li> 
      </ul> 

      </div><!--/.nav-collapse --> 
     </div> 
     </div> 
    </div> 

    <div class="container"> 
     <div class="content"> 
      <div class="row"> 
       <div class="login-form"> 
        <h2>Login</h2> 
        <form method="post" action=""> 
         <fieldset> 
          <div class="clearfix"> 
           <input name="email" type="text" placeholder="Email"> 
          </div> 
          <div class="clearfix"> 
           <input name="password" type="password" placeholder="Password"> 
          </div> 
<button name="login" class="btn btn-primary" type="submit">Sign in</button><br> 

         </fieldset> 
        </form> 
       </div> 
      </div> 
     </div> 
    </div> <!-- /container --> 
</body> 
</html> 
+1

通過'session_register()'方式調用'header()'Abd後,將** all ** html棄用,mysql函數集已被mysqli和pdo取代。 – dnagirl

+0

旁註:[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護,[棄用過程](http://j.mp/Rj2iVR)已經開始。看到[**紅框**](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)。 –

回答

0

在開始輸出HTML到瀏覽器之前,您需要完成所有會話處理。基本上,您只需將所有PHP移動到代碼的開頭,然後在HTML輸出內容中有條件地處理登錄成功/失敗消息。

您應該習慣於在腳本中預先執行大部分代碼邏輯,然後在輸出內容的腳本區域內只使用最少量的PHP。最後,隨着你變得更有經驗,你可能也會開始想要將你的腳本邏輯完全從你的輸出中分離出來(即完全放置在不同的文件中)。隨着時間的推移,大多數人發現這種方法(即分離應用程序邏輯和顯示邏輯)導致代碼更容易維護。

+0

我只是將所有的php都移動到了代碼的開頭,而且我仍然得到相同的錯誤,我不明白「在HTML輸出內容中有條件地處理登錄成功/失敗」的含義。 –

+0

如果您將所有PHP內容移到開頭,您應該不會收到完全相同的錯誤消息,因爲與已啓動的輸出相關的錯誤應該已消失。基本上你不應該使用session_register。只需在腳本的一開始調用'session_start()',然後在會話中設置值,如$ _SESSION ['username'] = $ username'。確保在發送任何標題或輸出到瀏覽器之前完成這一切。 –

+0

我用我的新代碼更新了這個問題。它仍然得到相同的錯誤。 –

0

我看你使用ob_start()不帶參數,所以你明白你可以使用它來防止頭被提前發送。不過,您似乎有點錯過了這一點:必須在發送任何頁面內容之前調用它。在這種情況下,它應該在<!DOCTYPE之前。

+0

我試圖把我所有的PHP代碼放在HTML之前,我得到相同的錯誤。 –