PHP会话变量 - 传递页面

时间:2012-04-20 22:14:10

标签: php html mysql forms session-variables

我希望有人可以指出我正确的方向,因为我觉得我在圈子里走来走去!

我将一个简单的购物应用程序放在一起 - 这是目前展示技术的唯一基础。

场景是有一个包含项目的数据库表。它们被分成蓝色和红色范围的项目。

在索引页面上,用户可以选择转到蓝色或红色项目。

在红色(或蓝色)项目页面上,显示项目并从数据库(MySQL)中提取当前价格和库存水平。然后,用户选择一个项目并单击购买按钮将其添加到购物车中。

然后页面会重定向到购物车页面,用户可以在此页面更新商品数量,进入结帐页面或返回“红色”或“蓝色”范围。

我的问题是......

1)如何设置会话数组以捕获购买“点击”时添加的项目?

到目前为止,我已经把它放在所有页面的顶部...

<?php session_start();
?>

但是,似乎只有一个项目可以添加到“购物车”。

这是我从我的数据库中提取项目的方式:

<?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>";
}
?>

任何帮助将不胜感激!!我觉得我好像在四处旅行!

4 个答案:

答案 0 :(得分:1)

在PHP会话变量中存储内容的问题是它们存储在cookie中,这意味着它们需要打开cookie。好的,现在大多数浏览器都设置了cookie。

但是,如果直接从客户端文件中读取值并将其放入数据库,该怎么办?是什么阻止某人黑客攻击cookie文件,其中“subtotal = 10000”并将值更改为“subtotal = 1”,然后将其推送到您的系统中?

如果您实际将购物会话存储在数据库中,那么您的系统将更加强大,例如

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用于查找&amp;将购物车物品存放在单独的表格中。

答案 1 :(得分:1)

这里最大的错误是,你将所有数据放在一个会话变量上,即$_SESSION['cart']

由于您要在会话中插入多个项目,因此您可以使用$_SESSION['cart'][]来插入项目。

每当您尝试获取存储的值时,再次使用for循环读取以及。

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

答案 2 :(得分:0)

试试这个

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

答案 3 :(得分:0)

当您添加更多时,$ _SESSION键正在被替换,所以实际上它只是覆盖现有值,您可以添加:

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

print_r($item);