PHP会话变量 - 传递页面

问题描述:

我希望有人可以指出我正在发生错误的正确方向,因为我觉得我可以在圈子里四处走动!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>"; 
} 
?> 

任何帮助将不胜感激! !我感觉好像我在周围旅行!

与存储在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用于查找将购物车项目存储在单独的表格中的&。

试试这个

$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

当你添加更多,所以实际上它只是覆盖现有价值$ _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

最大的失误在这里是,你正在将所有数据放在一个会话变量上,即$_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