使用 PHP $_Session 的购物车
Shopping cart using PHP $_Session
我正在学习 PHP 并且我正在尝试仅使用 PHP 和 $_SESSION
创建购物车
我想要实现的是:
- 添加现有产品只会更新数量变量
- 减少数量变量然后在数量 = 0 时从购物车中删除商品的删除按钮
- 一个清除购物车的按钮,可以从购物车中删除所有东西
我目前的问题是:
- 可以多次添加产品,但该项目不断出现在购物车中,并且数量没有更新。
- 删除按钮和清除购物车按钮目前都不起作用。
我正在努力实施全局数量变量,我不知道如何管理和更新它。
我觉得我的删除功能有点 hopeful/naive 并且数组检查已关闭,但我不确定如何修复它。
我觉得重置购物车功能已经很接近了,但我还差了一步。只是不知道在哪里
任何帮助或在正确方向上的推动将不胜感激,提前致谢。
我的代码
<?php
session_start ();
$items = [
[ "name" => "Lord of the Rings", "price" => 16.72 ],
[ "name" => "The Name of The Wind", "price" => 35.54 ],
[ "name" => "The Way of Kings", "price" => 32.237 ],
[ "name" => "Gravity Rising", "price" => 24.75 ],
[ "name" => "The Hobbit", "price" => 30.30 ],
];
//loads cart
if (! isset ( $_SESSION ['cart'] )) {
$_SESSION ['cart'] = array ();
//Attempt to add quantity variabke for cart
// for ($i = 0; $i < count($products); $i++) {
// $_SESSION["qty"][$i] = 0;
//}
}
// Add
if (isset ( $_POST ["buy"] )) {
//Atempt to add quantity variable
//If item is already in cart, quantity += 1. Else add item.
//if (in_array($_POST ["buy"], $_SESSION['cart'])) {
$_SESSION ['cart'][] = $_POST["buy"];
//}
}
// Delete Item
else if (isset ( $_POST ['delete'] )) {
if (false !== $key = array_search($_POST['delete'], $_SESSION['cart'])) { // check item in array
unset($_SESSION['cart'][$key]); // remove item
}
}
// Empty Cart
else if (isset ( $_POST ["reset"] )) { // remove item from cart
unset ( $_SESSION ['cart'] );
}
?>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<?php
foreach ( $items as $ino => $item ) {
$name = $item ['name'];
$price = $item ['price'];
echo " <p>$name</p>";
echo '<p>$' . number_format((float)$item['price'], 2, '.', '') . '</p>';
echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
}
?>
</form>
<?php
if (isset ( $_SESSION ["cart"] )) {
?>
<form action='(omitted link)'
target='_blank' method='post'
enctype='application/x-www-form-urlencoded'>
<table>
<tr>
<th>Product</th>
<th>Price</th>
<th>Quantity</th>
<th>Action</th>
</tr>
<?php
// Set a default total
$total = 0;
foreach ( $_SESSION['cart'] as $ino ) {
?>
<tr>
<td>
<?php echo $items[$ino]['name']; ?>
</td>
<td>
<?php echo number_format((float)$items[$ino]['price'], 2, '.', ''); ?>
</td>
<td>
Quantity: <?php echo "";?>
</td>
<td>
<button type='submit' name='reset' value='<?php echo $ino; ?>'>Delete</button>
</td>
</tr>
<?php
$total += number_format((float)$items[$ino]['price'], 2, '.', '');
} // end foreach
?>
Total: $<?php echo $total; ?>
<tr>
<td colspan="2">Total: $<?php echo($total); ?></td>
</tr>
<tr>
<td><button type='submit' name='clear'>Clear cart</button></td>
</tr>
</table>
</form>
<?php } ?>
欢迎来到 Stack Overflow!
您的代码存在一个主要问题:
foreach
循环和赋值:
foreach ( $items as $ino => $item ) {
与 echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
结合使用是危险的。 $ino
指的是数组索引,当新产品添加到列表某处(而不是末尾)时,购物车中的所有元素都可能指向错误的产品。
示例:
您有一个包含 ['Apple', 'Orange', 'Banana']
的数组。用户决定将所有三个都添加到购物车。购物车现在包含 [0, 1, 2]
或 "Apple, Orange, Banana"。
如果这些值现在来自数据库,有人可能已经将 "Strawberry" 添加到列表中并重新排序目录,因此新数组将类似于 ['Apple', 'Strawberry', 'Orange', 'Banana']
.购物车仍将具有旧值 [0, 1, 2]
,并且现在将指向 “Apple、Strawberry、Orange”。而是从一开始就使用产品 ID。
修复和一些帮助:
我不会写你的代码,因为你想自己学习。但只是为了给你一些建议和帮助,这里有一些提示。
使用产品 ID:
$items = [
[ "pid" => "LOTR", "name" => "Lord of the Rings", "price" => 16.72 ],
[ "pid" => "NameWind", "name" => "The Name of The Wind", "price" => 35.54 ],
[ "pid" => "WayKings", "name" => "The Way of Kings", "price" => 32.237 ],
[ "pid" => "GravRi", "name" => "Gravity Rising", "price" => 24.75 ],
[ "pid" => "Hobbit", "name" => "The Hobbit", "price" => 30.30 ],
];
使用 cart
会话变量中的密钥:
在循环中使用 ID 作为产品参考:
$pid = $item ['pid'];
echo "<button type='submit' name='buy' value='$pid'>Buy</button> ";
...如果它已经在购物车中,则将值加一...
if (isset ( $_POST["buy"] )) {
if (array_key_exists($_POST["buy"], $_SESSION['cart'])) {
$_SESSION['cart'][$_POST["buy"]] += 1;
} else {
$_SESSION['cart'][$_POST["buy"]] = 1;
}
}
然后使用与删除按钮相同的方法减少值。
正在重置购物车:
当您检查 $_POST["reset"]
时,购物车不会被清除,但按钮名称为“清除”:<button type='submit' name='clear'>Clear cart</button>
.
我正在学习 PHP 并且我正在尝试仅使用 PHP 和 $_SESSION
创建购物车我想要实现的是:
- 添加现有产品只会更新数量变量
- 减少数量变量然后在数量 = 0 时从购物车中删除商品的删除按钮
- 一个清除购物车的按钮,可以从购物车中删除所有东西
我目前的问题是:
- 可以多次添加产品,但该项目不断出现在购物车中,并且数量没有更新。
- 删除按钮和清除购物车按钮目前都不起作用。
我正在努力实施全局数量变量,我不知道如何管理和更新它。
我觉得我的删除功能有点 hopeful/naive 并且数组检查已关闭,但我不确定如何修复它。
我觉得重置购物车功能已经很接近了,但我还差了一步。只是不知道在哪里
任何帮助或在正确方向上的推动将不胜感激,提前致谢。
我的代码
<?php
session_start ();
$items = [
[ "name" => "Lord of the Rings", "price" => 16.72 ],
[ "name" => "The Name of The Wind", "price" => 35.54 ],
[ "name" => "The Way of Kings", "price" => 32.237 ],
[ "name" => "Gravity Rising", "price" => 24.75 ],
[ "name" => "The Hobbit", "price" => 30.30 ],
];
//loads cart
if (! isset ( $_SESSION ['cart'] )) {
$_SESSION ['cart'] = array ();
//Attempt to add quantity variabke for cart
// for ($i = 0; $i < count($products); $i++) {
// $_SESSION["qty"][$i] = 0;
//}
}
// Add
if (isset ( $_POST ["buy"] )) {
//Atempt to add quantity variable
//If item is already in cart, quantity += 1. Else add item.
//if (in_array($_POST ["buy"], $_SESSION['cart'])) {
$_SESSION ['cart'][] = $_POST["buy"];
//}
}
// Delete Item
else if (isset ( $_POST ['delete'] )) {
if (false !== $key = array_search($_POST['delete'], $_SESSION['cart'])) { // check item in array
unset($_SESSION['cart'][$key]); // remove item
}
}
// Empty Cart
else if (isset ( $_POST ["reset"] )) { // remove item from cart
unset ( $_SESSION ['cart'] );
}
?>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<?php
foreach ( $items as $ino => $item ) {
$name = $item ['name'];
$price = $item ['price'];
echo " <p>$name</p>";
echo '<p>$' . number_format((float)$item['price'], 2, '.', '') . '</p>';
echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
}
?>
</form>
<?php
if (isset ( $_SESSION ["cart"] )) {
?>
<form action='(omitted link)'
target='_blank' method='post'
enctype='application/x-www-form-urlencoded'>
<table>
<tr>
<th>Product</th>
<th>Price</th>
<th>Quantity</th>
<th>Action</th>
</tr>
<?php
// Set a default total
$total = 0;
foreach ( $_SESSION['cart'] as $ino ) {
?>
<tr>
<td>
<?php echo $items[$ino]['name']; ?>
</td>
<td>
<?php echo number_format((float)$items[$ino]['price'], 2, '.', ''); ?>
</td>
<td>
Quantity: <?php echo "";?>
</td>
<td>
<button type='submit' name='reset' value='<?php echo $ino; ?>'>Delete</button>
</td>
</tr>
<?php
$total += number_format((float)$items[$ino]['price'], 2, '.', '');
} // end foreach
?>
Total: $<?php echo $total; ?>
<tr>
<td colspan="2">Total: $<?php echo($total); ?></td>
</tr>
<tr>
<td><button type='submit' name='clear'>Clear cart</button></td>
</tr>
</table>
</form>
<?php } ?>
欢迎来到 Stack Overflow!
您的代码存在一个主要问题:
foreach
循环和赋值:
foreach ( $items as $ino => $item ) {
与 echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
结合使用是危险的。 $ino
指的是数组索引,当新产品添加到列表某处(而不是末尾)时,购物车中的所有元素都可能指向错误的产品。
示例:
您有一个包含 ['Apple', 'Orange', 'Banana']
的数组。用户决定将所有三个都添加到购物车。购物车现在包含 [0, 1, 2]
或 "Apple, Orange, Banana"。
如果这些值现在来自数据库,有人可能已经将 "Strawberry" 添加到列表中并重新排序目录,因此新数组将类似于 ['Apple', 'Strawberry', 'Orange', 'Banana']
.购物车仍将具有旧值 [0, 1, 2]
,并且现在将指向 “Apple、Strawberry、Orange”。而是从一开始就使用产品 ID。
修复和一些帮助:
我不会写你的代码,因为你想自己学习。但只是为了给你一些建议和帮助,这里有一些提示。
使用产品 ID:
$items = [
[ "pid" => "LOTR", "name" => "Lord of the Rings", "price" => 16.72 ],
[ "pid" => "NameWind", "name" => "The Name of The Wind", "price" => 35.54 ],
[ "pid" => "WayKings", "name" => "The Way of Kings", "price" => 32.237 ],
[ "pid" => "GravRi", "name" => "Gravity Rising", "price" => 24.75 ],
[ "pid" => "Hobbit", "name" => "The Hobbit", "price" => 30.30 ],
];
使用 cart
会话变量中的密钥:
在循环中使用 ID 作为产品参考:
$pid = $item ['pid'];
echo "<button type='submit' name='buy' value='$pid'>Buy</button> ";
...如果它已经在购物车中,则将值加一...
if (isset ( $_POST["buy"] )) {
if (array_key_exists($_POST["buy"], $_SESSION['cart'])) {
$_SESSION['cart'][$_POST["buy"]] += 1;
} else {
$_SESSION['cart'][$_POST["buy"]] = 1;
}
}
然后使用与删除按钮相同的方法减少值。
正在重置购物车:
当您检查 $_POST["reset"]
时,购物车不会被清除,但按钮名称为“清除”:<button type='submit' name='clear'>Clear cart</button>
.