1

我希望有人能指出我出错的正确方向,因为我觉得我在绕圈子!

我正在整理一个简单的购物应用程序 - 目前它只是演示技术的非常基础的应用程序。

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

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

一旦进入红色(或蓝色)商品页面,就会显示商品并从数据库 (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

4 回答 4

1

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

由于您想在会话中插入多个项目,因此您必须使用$_SESSION['cart'][]插入项目。

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

foreach($_SESSION['cart'] as $cartItem) {
  $cartItem; // will have all the item individually on each pass
}
于 2012-04-20T22:35:56.373 回答
1

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

但是,如果您直接从客户端文件中读取值并将其放入数据库中呢?有什么办法可以阻止某人破解显示“subtotal=10000”的 cookie 文件并将值更改为“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 用于在单独的表中查找和存储购物车项目。

于 2012-04-20T22:22:53.690 回答
0

尝试这个

$item = array();
foreach($_POST as $fieldname => $fieldvalue) {
    $item[$fieldname][] = $fieldvalue;
} 
于 2012-04-20T22:23:00.297 回答
0

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

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

print_r($item);
于 2012-04-20T22:23:04.613 回答