2012-04-21 37 views
0

我目前正在使用PHP中的應用程序,我需要維護一個購物車。一切都很好。如何在PHP中維護全局會話?

當一個項目被添加到購物車中,我需要在每個頁像這樣「的購物籃1項的」 頭顯示一條消息,如果車包含一個項目。

當添加附加的項(或刪除),該消息應該相應地改變不需要刷新頁面像等「中的購物籃2項」。

我面臨什麼問題是,我需要刷新頁面時,一些項目被刪除或添加到購物車(當時只有到那時,我可以看到在頁面頭更新項目)

例如,讓我們說,在購物車是正確的現在含有2項,現在一個附加項添加,在消息「在shopiing籃2項」仍然會顯示,而不是顯示「3購物籃中的物品「,直到頁面刷新。


在Java中,我們有如下SessionListener

package sessionListener; 

import javax.servlet.annotation.WebListener; 
import javax.servlet.http.HttpSession; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

@WebListener() 
public class SessionListener implements HttpSessionListener 
{ 
    private HttpSession session=null;   

    @Override 
    public void sessionCreated(HttpSessionEvent se) 
    { 
     session=se.getSession(); 
     //Use this session    
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent se) 
    { 

    } 
} 

我可以用sessionCreated()方法,以滿足要求,因爲這是它excecuted只有當第一次創建會話一旦方法。

同樣,在.NET中,我們的Global.asax應用程序文件如

<%@ Application Language="C#" %> 

<script runat="server"> 

    protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 

    } 

    void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 

    } 

    void Application_End(object sender, EventArgs e) 
    { 
     // Code that runs on application shutdown    
    } 

    void Application_Error(object sender, EventArgs e) 
    { 
     // Code that runs when an unhandled error occurs 

    } 

    void Session_Start(object sender, EventArgs e) 
    { 
     // Code that runs when a new session is started 
     Session.Add("Message", SomeValue);    
    } 

    void Session_End(object sender, EventArgs e) 
    { 
     // Code that runs when a session ends. 
     // Note: The Session_End event is raised only when the sessionstate mode 
     // is set to InProc in the Web.config file. If session mode is set to StateServer 
     // or SQLServer, the event is not raised. 

     Session.Abandon(); 

    } 

</script> 

我可以用void Session_Start(object sender, EventArgs e)方法,以滿足需求,因爲這是一個會話開始時被調用一次的方法(每個用戶會話一次)。

但在PHP中,我找不到類似的概念,只有在創建新會話時執行一次(我現在沒有在PHP中使用任何框架)。

如果是這樣,那麼當購物車的狀態更新而沒有頁面刷新時,如何在每個頁面的標題上顯示上面指定的消息?

回答

2

要更改頁面的一部分而不刷新,您將需要客戶端語言。 Javascript可以幫助你,特別是在AJAX調用中:你可以調用一個PHP腳本來返回你購物車中的物品數量。

即使用戶在瀏覽器中打開了多個選項卡,也可以每隔X分鐘調用一次以刷新項目計數。

+0

確實。 @Bhavesh - 無論您使用的服務器語言如何,都是如此。即使對於Java或.net,您仍然需要頁面刷新,或者JS小部件來修改DOM。 – halfer 2012-04-21 13:23:59

+0

在Java和.NET中,確實不需要頁面刷新,因爲在添加到購物車時,頁面正被重定向(或重新加載,同時刪除購物車中的項目或更新購物車),這會自動導致標題上的消息相應地改變,因爲在上面的片段中提到的全局方法中維護了項目計數。這種情況在PHP中沒有發生,因爲我們不能擁有隻啓動一次的全局(會話)變量。 – Bhavesh 2012-04-21 13:43:15

+0

正是因爲這個原因,據我所知,在使用PHP的時候,一個購物車被維護在一個數據庫表中,這確實是一個錯誤的概念,因爲這涉及對數據庫的額外操作。在Java中,購物車可以簡單地保存在'SessionListener'中的'Collection,Hashtable,List'或類似的東西中。在.NET中,它可以保存在Globlal.asax應用程序文件中的'DataTable'中,當且僅當客戶確認該命令需要對數據庫進行較少操作時才能最終插入到數據庫中。 – Bhavesh 2012-04-21 13:56:11

0

您可以使用JavaScript的AJAX調用向服務器發出不刷新頁面的請求。

但請注意,有些瀏覽器不支持(或已禁用)JavaScript。所以請確保你的腳本在刷新頁面時仍然可以工作。

0

正如我在一個項目中所做的那樣:購物車在每次更改時在兩個位置更新:在服務器上和在加載的頁面中動態地更新。

上車項目的+/-按鈕來改變其數量會觸發一個JavaScript事件,即執行以下操作的點擊:

  1. 使一個ajax call到服務器,讓它知道車的內容發生了變化;
  2. 更新加載頁面中顯示的購物車。

看看JS庫,例如jQueryMootools。與從頭開始編寫代碼相比,它們使JS腳本編寫更容易!還有很多其他類似的庫。