2010-07-27 131 views
0

我有這個php登錄系統,我在localhost上工作得很好,我買了一個webhotel,現在它不再工作,我找不到它出錯的地方。它不會設置會話?

我沒有得到任何錯誤。

登錄頁面在index.php中,當你登錄時,如果任何事情都沒問題(沒有錯誤/錯誤的密碼等),那麼你將被重定向到home.php。

事實並非如此。當我登錄時,它只是刷新index.php並將其輸出到頂端:

警告:無法修改標頭信息 - httpd.www中的(httpd.www/oBz/index.php:2)已發送的標頭/oBz/index.php 221行

on line 221 there's: header(「Location:home.php」);

好的,所以我通過輸入地址手動去home.php。現在,在home.php我有這樣的頂部:

include 'dbc.php'; 
page_protect(); 
echo "HELLO WORLD"; 

page_protect檢查是否有設置任何會話或餅乾(記得我),但是如果事情已定,你會看到的內容「HELLO WORLD」否則你不會。

但現在當我home.php進入我剛剛收到此:

警告:在session_start()[function.session啓動]:不能發送會話cookie - 頭已經發出(輸出開始httpd.www/oBz/dbc.php:29)在httpd.www/oBz/dbc.php上線69
警告:session_start()[function.session-start]:無法發送會話緩存限制器 - 已發送的頭文件(輸出在httpd.www/oBz/dbc.php:29)在httpd.www/oBz/dbc.php在線69
警告:不能修改標題信息 - 已經發送的標題(輸出在httpd.www/oBz開始/dbc.php:29)在httpd.www/oBz/dbc.php上117

69行theres session_start(),它是函數page_protect()中的第一行;

線117個孤單header("Location: index.php"),是那裏,如果你沒有登錄重定向(會話設置/設置Cookie)

希望我提供的信息不夠,如果不只是評論你需要什麼,我會盡我最好把它提供給你..

謝謝

更新:

這裏是dbc.php:http://phpbin.net/x/999009567

** index.php文件,當您登錄並在會話設置http://phpbin.net/x/1564167411

**更新: 我現在解決了這個頭警告/錯誤,但不是爲會話問題的解決方案!

**更新: phpbin.net/x/25857430更新的dbc.php,之前在dbc.php中的所有html都在一個新的文件top.php中。我包括頂部。php文件在index.php中的doLogin函數部分後,所以沒有得到任何錯誤的頭文件..

***更新:問題是在這裏:http://phpbin.net/x/557713701這就是爲什麼它重定向到index.php所有時間

+0

那麼我們可以看到dbc.php嗎? – spinon 2010-07-27 22:42:38

+0

http://phpbin.net/x/999009567 – Karem 2010-07-27 22:46:41

回答

4

線2您已經發送並輸出到所有的HTML PHP的第一個位之前存在的瀏覽器。

您需要重新排列代碼,以便在將任何HTML發送到瀏覽器之前發生需要發送標題的任何內容。

所以:

<?php 
session_start(); 

?> 
<html> 
<head> 
... 

最簡單的答案可能是PHP代碼後,移動所有的HTML。在那裏有session_regenerate_id()的呼叫,在logout功能中有另一個session_start()

對於這個問題,爲什麼在這個文件中有HTML?除會話功能外,我還發現至少有2個電話撥打header()

更新:

if(isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])){ 
    /* we double check cookie expiry time against stored in database */ 

// I snipped a bunch of code, to point out what's going on here 

    } else { 
    header("Location: index.php"); 
    die(); 
    } 

所以,如果不存在cookie值,你猜發生在這裏?

+0

我做了你說重新安排的代碼,移動所有的HTML在另一個文件(TOP.PHP),所以我只是打電話給HTML的東西,這清理了警告但沒有修復解決方案 – Karem 2010-07-27 23:13:37

+0

@ karem Theres有很多原因可能會重定向到index.php。找到每個header(「Location:index.php」);'在此之前調用並調試代碼。例如: – 2010-07-27 23:29:45

+0

@喬治瑪麗安餅乾沒有被設置,如果你沒有選中「記住」,但我想你會議。我有2個標頭位置index.php,一個內部註銷功能,以及一個如果任何cookie或會話設置 – Karem 2010-07-27 23:36:06

4

您正在查看錯誤消息的錯誤位。你正在看的部分是它試圖發送標題的地方(即:它認識到某些事情是錯誤的地方)。然而,相關部分是它開始生產產量的部分。對於第一個錯誤,它表示輸出已經在index.php第二行開始。您可能在開始<?php標記前留有空格。我會檢查第一...

+0

請檢查我已上傳的dbc.php。不,我沒有<?php的空白。 – Karem 2010-07-27 22:49:03

+0

@Karem以及它可能在?>標記之後。你爲什麼不能自己檢查第29行? – 2010-07-27 22:52:34

+0

您已在標籤之前輸出。必須在任何輸出之前調用session_start()。爲什麼它可能在你的本地主機服務器上工作的原因是你打開了輸出緩衝(這是我的猜測)。一個簡單的<?php session_start();在''之前''''應該解決問題(當然也可以將它從該函數中移除)。 – 2010-07-27 22:52:39

0

我猜想:

你發出

die(); 

header("Location: home.php");

???

您可能會忘記關閉輸出,以便打印出頁面的其餘部分,而不管此重定向如何。

另外,請確認編碼是否好,應該是UTF-8?有時候,我聽錯了自己:(

好了,更新的答案:

266 header("Location: index.php"); 

303 header("Location: home.php"); 

340 header("Location: home.php"); 

您沒有發出模具()這三條線之後所以這可能是一個風險:)

+0

我用exit();我嘗試死();我仍然有頭錯誤,但我發現這不是會話問題的問題。 – Karem 2010-07-27 22:50:09

+0

@Karem:請檢查我的更新回答 – 2010-07-27 23:23:06

+0

我已發出die();現在,仍然沒有:( – Karem 2010-07-27 23:26:32

0

而且dbc.php的第29行是回顯,打印或者生成一些輸出到瀏覽器....那麼圍繞該行的dbc.php中的代碼是什麼?

同樣的index.php文件

+0

請檢查更新的問題dbc.php – Karem 2010-07-27 22:51:04