我目前正在使用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中使用任何框架)。
如果是這樣,那麼當購物車的狀態更新而沒有頁面刷新時,如何在每個頁面的標題上顯示上面指定的消息?
確實。 @Bhavesh - 無論您使用的服務器語言如何,都是如此。即使對於Java或.net,您仍然需要頁面刷新,或者JS小部件來修改DOM。 – halfer 2012-04-21 13:23:59
在Java和.NET中,確實不需要頁面刷新,因爲在添加到購物車時,頁面正被重定向(或重新加載,同時刪除購物車中的項目或更新購物車),這會自動導致標題上的消息相應地改變,因爲在上面的片段中提到的全局方法中維護了項目計數。這種情況在PHP中沒有發生,因爲我們不能擁有隻啓動一次的全局(會話)變量。 – Bhavesh 2012-04-21 13:43:15
正是因爲這個原因,據我所知,在使用PHP的時候,一個購物車被維護在一個數據庫表中,這確實是一個錯誤的概念,因爲這涉及對數據庫的額外操作。在Java中,購物車可以簡單地保存在'SessionListener'中的'Collection,Hashtable,List'或類似的東西中。在.NET中,它可以保存在Globlal.asax應用程序文件中的'DataTable'中,當且僅當客戶確認該命令需要對數據庫進行較少操作時才能最終插入到數據庫中。 – Bhavesh 2012-04-21 13:56:11