2012-03-09 92 views
2

這可能是一個沒有答案的問題,但...PHP:將變量/函數/ session_start保存在一個包含文件中?

在傳統的ASP我曾經有一個美妙的包含文件在每個頁面的頂部。它不僅在網站上的每個頁面的頁面頂部都有基本的html模板,而且還有關鍵變量,如dbase連接字符串,有用的函數和各種變量,如果更改將通過整個站點傳播。我只需將它包含在網站的每個頁面的頂部,它給了我統一的外觀和訪問各種各樣的東西。最好的部分...... ASP讓我在HTML發送到頂部包含文件後,例如在用戶成功登錄,表單提交或其他操作之後,在下面進行重定向。

現在我正在學習PHP(仍然noob)。似乎沒有簡單的方法來做重定向,一旦html已經發送爲header.php失敗。在每個頁面上,像session_start()所需的某些內容必須位於任何html之前。所以我可以在每個頁面的頂部放置一個無html的包含常用函數,字符串和開頭的session_start之類的調用。但是,如果我想根據下面的某些條件進行重定向,即成功登錄,似乎並沒有簡單的方法可以將頂級html模板保留在頂部。如果不是重定向問題,我會在HTML之前放置代碼並將其全部放在頂部包含文件中。

是否有保持會話開始於每個頁面的第一行,並有其他代碼方便,使用常見的html模板,仍然保留重定向的能力的最佳做法。

否則,如果重定向始終是任何HTML格式發送之前,那麼HTML不能包括作爲網站的頂級單文件,但必須插入下面的代碼,每個頁面上的任何重定向...

感謝您提供有關經驗豐富的PHP手中最佳實踐的建議。

+5

聽起來您的網站已經達到了將大量表現代碼(HTML)與業務邏輯混合在一起的程度(PHP)。儘管你的問題當然可以解決而沒有太多的痛苦(儘管如果沒有看到你的實際代碼,我們無法幫助你),你應該考慮將業務邏輯分解爲有組織的類,並且只在「視圖」或「模板」文件中使用HTML。這被稱爲[關注點分離](http://en.wikipedia.org/wiki/Separation_of_concerns),是一種非常常見的最佳做法。 – 2012-03-09 23:02:27

回答

0

對於session_start問題,在板上的其他地方,我發現了兩個建議來檢查會話是否已啓動,以避免在會話已存在時啓動時出現錯誤消息。第一個是

if (session_id() === "") { 
    session_start(); 
} 

但是,它返回一個錯誤,期待{而不是{。第二種方法

if(empty($_SESSION)) 
    session_start(); 

不會拋出錯誤,但如果爲空則返回0。所以我的計劃是把session_start放在header頭部的開頭,但是用一個測試來檢查會話是否已經開始......然後把日誌檢查代碼重定向到登錄頁面,除非你已經登錄了,或者它是加入頁面。然後我將放入一個等於頁面頂部的html的變量。這個變量可以在任何包含頭文件的文件中被回顯以啓動輸出。這樣,我想,我已經在頁面中將邏輯與邏輯分開,以允許在邏輯中重定向。對於網站頁面,他們會得到標題包含。每個頁面都可以執行邏輯併產生一個味精。這個msg可以在頂部html被回顯後被回顯。結果:頭文件包含開頭的session_start,一個統一的日誌檢查來管理整個網站的訪問和頂層html模板。頁面執行自己的邏輯並可以執行重定向。最後,他們迴應輸出。將看看它是否工作..

+0

好的,抱歉發貼。如果您可以在調用session_start之前檢查其狀態,似乎會有不同意見。有人說如果(!isset($ _ SESSION))session_start(); }有效。我給了上面2個更多的例子。其他人說,除非你打電話給session_start(),否則你不能檢查會話。我想做檢查,以確保不會意外地在會話之上開始會話。任何人都有明確的答案?謝謝! – user1260310 2012-03-10 22:01:39

+0

作爲我爲所有遇到此問題的人所做的最後一點說明,我創建了一個php代碼文件,以插入每個頁面的頂部,但沒有WHITESPACES或RETURNS,因爲它們將停止重定向。在這個文件中,我使用非常有用的heredocs wh將變量中的頂部html存儲在一個變量中。有些人不喜歡它,但它對我來說就像是一種魅力。然後,我需要在重定向之後調用此變量以啓動頁面輸出。不像最佳實踐那樣,但導致結構合理的代碼。毫無疑問,課堂和對象是更好的,但這會在同一時間。 – user1260310 2012-03-23 14:24:46