2012-04-20 149 views
1

我希望有人可以指出我正在發生錯誤的正確方向,因爲我覺得我可以在圈子裏四處走動!PHP會話變量 - 傳遞頁面

我把一個簡單的購物應用程序放在一起 - 它現在只是非常基本的演示技術。

的情況是,有一個在項目一個數據庫表。他們已經分成藍色和紅色範圍內的項目。

在索引頁面上,用戶可以選擇去藍色或紅色的項目。

一旦紅色(或藍色)物品頁面上

,顯示項目和目前的價格和庫存水平從數據庫(MySQL的)拉。用戶然後選擇一個項目並點擊購買按鈕將其添加到他們的購物車中。

頁上,然後重定向到購物車頁面,用戶可以更新項目的數量,進入到結帳頁面或返回到「紅色」或「藍色」的範圍。

我的問題是這樣的.....

1)如何設置我的會話陣列來捕捉項目,因爲它們是在買「點擊」添加?

到目前爲止,我有這個在所有頁面的頂部...

<?php session_start(); 
?> 

但是隻有一個項目,似乎能夠被添加到「購物車」。

這是我可是從我的DB拉項目如何:

<?php 
$result = mysql_query ('SELECT * FROM items WHERE colour="red"'); 
// fetch the resulting row as an associative array 
while ($row = mysql_fetch_assoc ($result)){ 
    echo '£', number_format($row ['price']/100, 2, '.', ' '); 
    } 
?></p> 

2)這是紅色或藍色的頁面上每個項目下的表單操作的代碼。

<form method="post" action="cart.php"> 
        <p> 
<input type="submit" name="submit" value="Buy" /> 
<input type="hidden" name="cart" value="add" /> 
<input type="hidden" name="item" value="redplate" /> 
        </p> 
       </form> 

3)如何做我以後購物車頁面上的任何數量的更新顯示在結帳頁面的「命令」項?

到目前爲止,這是它的購物車頁面上 - 我重複這與它的更新量??拉結帳頁面上....

<?php 
$submit = $_POST["submit"]; 

//Call the function and save all data into the array $_SESSION['form'] 
if($submit == "Buy"){setSessionVars();} 

function setSessionVars() { 

    $item = array(); 
    foreach($_POST as $fieldname => $fieldvalue) { 
     $item[$fieldname] = $fieldvalue; 
    } 
    $_SESSION['cart'] = $item; 

      echo "   <table> 
      <tr> 
      <td> 
       <img src=\"images/{$item['item']}.jpg\" /> 
        <td/> 
      <td> 
       {$item['item']} = 
        </td> 
      <td> 
      <input type=\"text(5)\" name=\"value\" value=\"1\" /> 

      <input type=\"submit\" name=\"puchasedquan\" value=\"Click to update\" /> 

      </td> 
      </tr> 
          </table>"; 
} 
?> 

任何幫助將不勝感激! !我感覺好像我在周圍旅行!

回答

1

與存儲在PHP會話瓦爾東西的問題是,它們存儲在cookie中,這意味着他們需要cookie才能打開。好的,現在大多數瀏覽器都設置了Cookie。

但是如果您直接從客戶端文件讀取值並將其放入數據庫,那麼該怎麼辦?什麼來阻止某人攻擊它所說的「subtotal = 10000」的cookie文件,並將該值更改爲「subtotal = 1」,然後通過您的系統推送該cookie文件?

如果您實際上將購物會話存儲在數據庫中,例如,您的系統會更加健壯。

CREATE TABLE tbl_shopping_session(
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    php_session_key VARCHAR(32), 
    coupon_id INT, 
    FOREIGN KEY(coupon_id) REFERENCES tbl_coupons(id), 
    updated TIMESTAMP /* a timestamp is added to find & del old sessions */ 
) ENGINE = InnoDB; 

CREATE TABLE tbl_shopping_cart(
    shopping_session_id INT, 
    FOREIGN KEY(shopping_session_id) REFERENCES tbl_shopping_session(id) ON DELETE CASCADE, 
    product_id INT, 
    FOREIGN KEY(product_id) REFERENCES tbl_products(id), 
    cart_qty INT /* or DECIMAL(9,3) or something */, 
    subtotal DECIMAL(18,4) 
) ENGINE = InnoDB; 

從那裏你可以得到的圖片...php_session_key用於識別當前的購物會話,並且當前會話ID用於查找將購物車項目存儲在單獨的表格中的&。

0

試試這個

$item = array(); 
foreach($_POST as $fieldname => $fieldvalue) { 
    $item[$fieldname][] = $fieldvalue; 
} 
+0

謝謝,我只是嘗試這樣做,而是通過「陣列其拉動」爲現在的項目名稱和沒有圖像 – ez007 2012-04-20 22:29:06

+0

嘗試的print_r($ whateveryouritemvariableis);?什麼是輸出 – squarephoenix 2012-04-20 22:29:59

+0

的ITs想出了一個錯誤林? !?甚至不知道香港專業教育學院確定一個正確的...虐待更新我與編碼從數據庫中選擇的項目主要Q – ez007 2012-04-20 22:34:25

0

當你添加更多,所以實際上它只是覆蓋現有價值$ _SESSION鍵被替換,你可以補充一點:

foreach($_POST as $fieldname => $fieldvalue) { 
    // Now the array will be enumerated 
    $item[$fieldname][] = $fieldvalue; 
} 

print_r($item); 
+0

謝謝!它拋出一個解析錯誤.....'解析錯誤:語法錯誤,意外的$結束。'它指向該生產線是空白的,所以我不會太相信... – ez007 2012-04-20 22:37:24

+0

確保您的法國括號{}是匹配的,你可能會丟失的地方他們! – JREAM 2012-04-20 22:43:46

+0

陣列([提交] =>陣列([0] =>求購)[cartaction] => Array([0] => add)[item] => Array([0] => redplate))看起來像是鏈接到實際項目上的表單submit? – ez007 2012-04-20 22:49:02

1

最大的失誤在這裏是,你正在將所有數據放在一個會話變量上,即$_SESSION['cart']

由於要在會議中插入多個項目,你必須使用$_SESSION['cart'][]插入項目。

每當你試圖讓存儲的值,再使用for循環讀取以及。 !

foreach($_SESSION['cart'] as $cartItem) { 
    $cartItem; // will have all the item individually on each pass 
} 
+0

謝謝 - 只是去嘗試,它仍然只顯示一次,我回去,並嘗試添加更多的一個項目? – ez007 2012-04-20 23:02:16

+0

確保你已經在每頁的頂部調用了'session_start()'。 – Starx 2012-04-20 23:04:50

+0

我在每一頁都打過這個電話 - 我一定錯過了更多的東西! – ez007 2012-04-20 23:10:57