New Ribbon
用Canva設計超快超質感(第2版):商業設計、簡報、影片、網頁、電子書與AI應用最速技 AI繪圖工具 × AI視覺設計平台,從圖像生成到專業設計! 最強職場助攻!ChatGPT + AI 高效工作術 短影音制霸:打造TikTok、YT Shorts、IG Reels成功方程式與AI高效創作力 Canva+AI創意設計與品牌應用250招:從商業技巧、社群祕技到AI圖文影音特效 快快樂樂學威力導演2024.影音剪輯與AI精彩創作 Power Automate自動化超效率工作術 Midjourney AI圖像魔導書:搭配ChatGPT魔法加倍 超人氣FB+IG+LINE社群經營與行銷力(第二版) 翻倍效率工作術:不會就太可惜的 Excel × ChatGPT 自動化應用 AppInventor2零基礎入門班中文版(第六版) Python零基礎入門班(第四版) C語言學習聖經 用Canva設計超快超質感:平面、網頁、電子書、簡報、影片製作與AI繪圖最速技 PHP8/MySQL網頁程式設計自學聖經 翻倍效率工作術 - 不會就太可惜的Power BI大數據視覺圖表設計與分析(第三版) 社群經營一定要會的影音剪輯與動畫製作術 Notion高效管理250招:筆記×資料庫×團隊協作,數位生活與工作最佳幫手 Office 2021高效實用範例必修16課(附500分鐘影音教學/範例檔) Excel自學聖經(第二版):從完整入門到職場活用的技巧與實例大全

 

  挑戰php5 購物車session的問題

piggy

piggy
更新時間:2009/9/1 上午 06:22:46

 



您好 我有去下載您提供的檔案了 對wfcart類別的運作有比較了解了

但對於物件的值是怎麼由product.php傳到cart.php再傳到checkout.php還有些不了解的地方
目前只知道使用$cart->add_item()方法後 商品資訊會被帶到物件中
能在瀏覽器關閉之前 能一直維持購物車內的商品資訊

啟動session的標準格式:
session_start();
$cart =& $_SESSION['cart'];
if(!is_object($cart)) $cart = new myCart();

1.
為什麼建立物件語法if(!is_object($cart)) $cart = new myCart();
要寫在$cart =& $_SESSION['cart'];之後呢?
是因為變數是由上往下傳遞的關係嗎?
還是它們之間完全沒有關係一個為變數 一個為物件

2.
書本第16-10頁第31行$_SESSION["loginMember"] = $username
將會員的帳號變數$username儲存在$_SESSION["loginMember"]之中

$cart =& $_SESSION['cart'];
將購物車的值設定為session
我想知道兩者的差別是在那邊?

3.
我試過將product.php裡的$cart =& $_SESSION['cart'];
顛倒過來改成$_SESSION['cart'] =& $cart;
=是將右方的值存到左方的變數中
但卻沒有影響到程式的運作是為什麼?
還是其實兩者的意義是不同的
還有"&"在$_SESSION['cart']跟$cart之前會產生的意義 是否也是不同的?

4.
在cart.php和checkout.php若移除
$cart =& $_SESSION['cart'];
if(!is_object($cart)) $cart = new myCart();
這兩句程式碼似乎不影響購物車物件的運作?為什麼?還有必要加嗎?

5.
之所以要設定$cart =& $_SESSION['cart'];
是因為要將$cart物件的值存在session裡
才能夠讓使用者在真正未結帳以前能夠到處瀏覽商品並將每一筆商品資訊保留起來嗎?
所以在product.php使用$cart->add_item()方法後
商品資訊變成物件的屬性值 傳到屬性的array()裡面是不能被保留下來的!?
因為由類別產生了$cart物件
又將$cart物件的值存在session裡
所以所有的商品資訊都在$_SESSION['cart']裡面了嗎?
當頁面被header()到cart.php的時候就已經是取用$_SESSION['cart']裡面的商品資訊了嗎?
包含我們wfcart跟mycart類別裡面也都是在取用$_SESSION['cart']裡面的資訊!?
而不是類別屬性裡的array()的資料嗎?
若上面敘述正確的話 cart.php 裡所使用的
$cart->deliverfee 跟 $cart->grandtotal怎麼知道要到$_SESSION['cart']裡面抓值?

6.
能夠有方法能echo $_SESSION['cart']裡面儲存的資料來看嗎?
我試著在加入商品後在cart.php上輸入

foreach($_SESSION['cart'] as $value=>$value2){
    echo $value." ".$value2."<br />";
}
得到結果為
deliverfee 0
grandtotal 0
total 0
itemcount 0
items Array
itemprices Array
itemqtys Array
iteminfo Array
只能顯示屬性值的部份出來
而不能得知items 裡面的陣列資料
要如何能讓$_SESSION['cart']
清楚的顯示出來呢?
讓我知道它到底做了些什麼

7.
書上在10-10頁的10.3.1有說
sessionID 以Cookie的方式儲存在用戶端來紀錄狀態
意思是$_SESSION['cart']的資料也是像cookie一樣存在temp files資料夾裡面嗎?
但我找不到它
它是用戶端能看到的嗎?


文淵閣工作室

文淵閣工作室
更新時間:2009/9/2 上午 10:52:01

 

1.這的確是個好問題。在這個購物車中是以傳址呼叫的方式來同步每個頁面與物件內屬性值的內容。所以每個使用到購物車功能的頁面都必須宣告這些程式碼的原因就是如此。

session_start();
$cart =& $_SESSION['cart'];
if(!is_object($cart)) $cart = new myCart();
順序也是有原因的,
它先啟動Session,然後在記憶體的固定一個位址來儲存$cart,再判斷$cart物件有沒有創建,沒有的話就新增。
如果你先新增$cart物件,那產生的當下就不一定會儲存到設定位址中,會造成錯誤。
2.
會員帳號這也是一個多網頁共用的問題,所以可以單純的方式儲存在Session中,所以不用傳址呼叫的方式。
而這裡的購物車物件,不僅僅是單純的Session來儲存幾個屬性值,還有更複雜的商品陣列,所以若能將所有的值放置在一個固定的位址中,無論哪一頁要使用時就直接由這個固定的位址來取得其值,是較為方便而不易錯的方式。
3.
不可能沒有影響,會無法執行。你測試的方式是否是改程式碼後,直接重整頁面呢?
那原來所宣告的Session與值都沒有消失,所以當然不會出錯,你應該把瀏覽器整個關閉,再重新開啟測試。
4.
不可能沒有影響,會無法執行。
請您也將product.php中的宣告移除,您沒有出現問題是因為在product.php中有宣告了,接下來cart.php、checkout.php當然就不需要宣告了。
不過只要使用到購物車的頁面就要宣告還是不變的原則,因為你不會知道使用者會先到哪一頁。
5.
就如上面所說,程式是宣告以傳址呼叫的方式來儲存購物車的內容,所以無論哪一頁修改了購物車的屬性,都會修改記憶體中這個位址中的值,所以無論哪一頁來取用其中的屬性及變數,都會同步,結果都會一樣。
6.試看看
foreach($_SESSION['cart'] as $itemName=>$itemValue){
    if(!is_Array($itemValue)){
     echo $itemName." ".$itemValue."<br />";
    }else{
     echo $itemName."<br />";
     foreach($itemValue as $arrVal){
     echo $arrVal."<br />";
     }
    }
}
7.Session產生的SessionID檔會儲存在伺服器端,PHP環境有宣告一個session_tmp資料夾即是儲存這個。

ven

ven
更新時間:2016/6/12 上午 03:20:49

 

想請問說,在加入購物點擊後,是應該轉跳至car.php嗎?!我這邊是點擊後停留在product.php?XXX 網頁沒轉跳。加入購物車點擊後,若按重新整理,會出現灌水現象!

文淵閣工作室

文淵閣工作室
更新時間:2016/6/13 上午 09:36:45

 

是,應該轉跳至car.php。




 

 

Re:挑戰php5 購物車session的問題

請輸入姓名。

已超出字元數目的最大值。


請輸入電子郵件。

格式無效。


請輸入內容。