使用 PHP $_Session 和 NO SQL 创建单页购物车
Create a one page shopping cart using PHP $_Session and NO SQL
我正在学习一些 PHP 并且我正在尝试创建一个全页面购物车。
我已经阅读并可以看到 SQL 基础系统的好处,但我想先学习基础知识。在这样做的过程中,我创建了一个包含关联数组中的产品的一体化页面,以及一个提交给自身的表单。
我要实现的是:
- 一个产品只能购买一次(购买按钮替换为删除按钮)
- 商品及其价格已添加到下面的购物车
- 用户可以将其从购物车或商品列表中删除
- 应根据需要更新总成本。
- "checkout" 按钮将提交项目名称和成本
- 表单发布到自身,不需要任何 SQL
我目前的问题是:
- 我一次不能购买超过一件商品,即购物车只包含最后购买的商品
- 如果已购买商品,我无法将其发送到 "check",如果是,请将 "buy" 替换为 "remove"
- 我无法在购物车中显示商品详情
- 结帐按钮没有将任何详细信息传递给我的测试
同样,我还没有在寻找 SQL 解决方案,只是使用 $_SESSION
和 $_POST
的纯 PHP 并且想使用按钮而不是 <a href add?>
输入链接。
感谢您提前阅读这里是代码:
<?php
session_start ();
$items = array (
'A123' => array (
'name' => 'Item1',
'desc' => 'Item 1 description...',
'price' => 1000
),
'B456' => array (
'name' => 'Item40',
'desc' => 'Item40 description...',
'price' => 2500
),
'Z999' => array (
'name' => 'Item999',
'desc' => 'Item999 description...',
'price' => 9999
)
);
if (! isset ( $_SESSION ['cart'] )) {
$_SESSION ['cart'] = array ();
}
// Add
if (isset ( $_POST ["buy"] )) {
$_SESSION ['cart'] = $_POST;
}
// Delete Item
else if (isset ( $_POST ['delete'] )) { // a remove button has been clicked
unset ( $_POST ['delete'] ); //
}
// Empty Cart
else if (isset ( $_POST ["delete"] )) { // remove item from cart
unset ( $_SESSION ['cart'] );
}
?>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<?php
foreach ( $items as $ino => $item ) {
$title = $item ['name'];
$desc = $item ['desc'];
$price = $item ['price'];
echo " <p>$title</p>";
echo " <p>$desc</p>";
echo "<p>$$price</p>";
if ($_SESSION ['cart'] == $ino) {
echo '<img src="carticon.png">';
echo "<p><button type='submit' name='delete' value='$ino'>Remove</button></p>";
} else {
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>Action</th>
</tr>
<?php
$total = 0;
foreach ( $_SESSION ["cart"] as $i ) {
?>
<tr>
<td>
<?php echo($_SESSION["cart"]); ?> <!--Item name-->
</td>
<td>price<?php echo($_SESSION["price"][$i] ); ?>
<!--Item cost-->
</td>
<td><button type='submit' name='delete' value='$ino'>Remove</button>
</p></td>
</tr>
<?php
$total = + $_SESSION ["amounts"] [$i];
}
$_SESSION ["total"] = $total;
?>
<tr>
<td colspan="2">Total: $<?php echo($total); ?></td>
<td><input type='submit' value='Checkout' /></td>
</tr>
<tr>
<td><button type='submit' name='clear'>Clear cart</button></td>
</tr>
</table>
</form>
<?php } ?>
您的脚本中有几处需要修复,所以我会将它们分解成各自的部分。
还有很多安全错误检查也应该用代码完成,但作为纯粹的学习练习,我绕过了这些因素。
定义购物车
您将购物车定义为数组:
if (! isset ( $_SESSION ['cart'] )) {
$_SESSION ['cart'] = array ();
}
但是,当您将商品添加到购物车时,您是在更换购物车:
// Add
if (isset ( $_POST ["buy"] )) {
$_SESSION ['cart'] = $_POST; //
}
要将商品添加 到购物车,您应该使用 $cart[] = $_POST
,但是,还有其他事项需要考虑。
加入购物车
当您只需要产品 ID 时,$cart[] = $_POST
将完整的 $_POST
数据添加到购物车。正确的方法是:
// Add
if (isset ( $_POST ["buy"] )) {
// Check the item is not already in the cart
if (!in_array($_POST ["buy"], $_SESSION['cart'])) {
// Add new item to cart
$_SESSION ['cart'][] = $_POST["buy"];
}
}
这将导致购物车存储多个值。例如,print_r($_SESSION['cart'])
可能显示:
array (
0 => 'A123',
1 => 'B456'
);
此数组中的每个项目都是已添加到您的购物车的项目。
正在从您的购物车中移除商品
现在 $_SESSION['cart']
的结构已经更改,"remove from cart" 操作也需要更新。使用 ,我们可以检查该值是否存在于数组中,找到它的键并将其删除。
// Delete Item
else if (isset ( $_POST ['delete'] )) { // a remove button has been clicked
// Remove the item from the cart
if (false !== $key = array_search($_POST['delete'], $_SESSION['cart'])) {
unset($_SESSION['cart'][$key]);
}
}
检查商品是否在您的购物车中
需要对您的代码进行进一步更改以支持新的数组结构。您可以使用 in_array
检查您的产品是否包含在购物车数组中。
<?php
foreach ( $items as $ino => $item ) {
// ... snipped for brevity
// Check if an item is in the cart by checking for the existence of its ID:
if (in_array($ino, $_SESSION['cart'])) { // The $ino would be 'a123' for your first product
echo "<p><button type='submit' name='delete' value='$ino'>Remove</button></p>";
} else {
echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
}
}
?>
简化您的代码
在上面的代码中,我删除了一些代码。您正在执行以下操作:
$title = $item ['name'];
$desc = $item ['desc'];
$price = $item ['price'];
echo " <p>$title</p>";
echo " <p>$desc</p>";
echo "<p>$$price</p>";
这可以简化为:
echo "<p>$item['name']</p>";
echo "<p>$item['desc']</p>";
echo "<p>$$item['price']</p>";
我 个人 会使用:
而不是最后一行中的双重 $$
echo '<p>$' . number_format($item['name']) . '</p>';
这使您可以更轻松地设置数字显示的格式。或者,您可以使用 money_format
.
显示购物车
此代码存在一些问题。
- 您正在尝试
echo($_SESSION['cart'])
,但这行不通。你不能 echo
数组
- 您在尝试使用
<?php echo($_SESSION["price"][$i] ); ?>
显示值时错误地使用了 foreach ($_SESSION ["cart"] as $i)
- 您正在使用于
$total
值的代码复杂化
- 由于随机
</p>
被混入 ,HTML 无效
正确的显示方式是:
<?php
// Set a default total
$total = 0;
foreach ( $_SESSION['cart'] as $ino ) {
?>
<tr>
<td>
Name: <?php echo $items[$ino]['name']; ?>
</td>
<td>
Price: <?php echo $items[$ino]["price"]; ?>
</td>
<td>
<button type='submit' name='delete' value='<?php echo $ino; ?>'>Remove</button>
</td>
</tr>
<?php
$total += $items[$ino]['price'];
} // end foreach
?>
Total: $<?php echo $total; ?>
我正在学习一些 PHP 并且我正在尝试创建一个全页面购物车。
我已经阅读并可以看到 SQL 基础系统的好处,但我想先学习基础知识。在这样做的过程中,我创建了一个包含关联数组中的产品的一体化页面,以及一个提交给自身的表单。
我要实现的是:
- 一个产品只能购买一次(购买按钮替换为删除按钮)
- 商品及其价格已添加到下面的购物车
- 用户可以将其从购物车或商品列表中删除
- 应根据需要更新总成本。
- "checkout" 按钮将提交项目名称和成本
- 表单发布到自身,不需要任何 SQL
我目前的问题是:
- 我一次不能购买超过一件商品,即购物车只包含最后购买的商品
- 如果已购买商品,我无法将其发送到 "check",如果是,请将 "buy" 替换为 "remove"
- 我无法在购物车中显示商品详情
- 结帐按钮没有将任何详细信息传递给我的测试
同样,我还没有在寻找 SQL 解决方案,只是使用 $_SESSION
和 $_POST
的纯 PHP 并且想使用按钮而不是 <a href add?>
输入链接。
感谢您提前阅读这里是代码:
<?php
session_start ();
$items = array (
'A123' => array (
'name' => 'Item1',
'desc' => 'Item 1 description...',
'price' => 1000
),
'B456' => array (
'name' => 'Item40',
'desc' => 'Item40 description...',
'price' => 2500
),
'Z999' => array (
'name' => 'Item999',
'desc' => 'Item999 description...',
'price' => 9999
)
);
if (! isset ( $_SESSION ['cart'] )) {
$_SESSION ['cart'] = array ();
}
// Add
if (isset ( $_POST ["buy"] )) {
$_SESSION ['cart'] = $_POST;
}
// Delete Item
else if (isset ( $_POST ['delete'] )) { // a remove button has been clicked
unset ( $_POST ['delete'] ); //
}
// Empty Cart
else if (isset ( $_POST ["delete"] )) { // remove item from cart
unset ( $_SESSION ['cart'] );
}
?>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<?php
foreach ( $items as $ino => $item ) {
$title = $item ['name'];
$desc = $item ['desc'];
$price = $item ['price'];
echo " <p>$title</p>";
echo " <p>$desc</p>";
echo "<p>$$price</p>";
if ($_SESSION ['cart'] == $ino) {
echo '<img src="carticon.png">';
echo "<p><button type='submit' name='delete' value='$ino'>Remove</button></p>";
} else {
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>Action</th>
</tr>
<?php
$total = 0;
foreach ( $_SESSION ["cart"] as $i ) {
?>
<tr>
<td>
<?php echo($_SESSION["cart"]); ?> <!--Item name-->
</td>
<td>price<?php echo($_SESSION["price"][$i] ); ?>
<!--Item cost-->
</td>
<td><button type='submit' name='delete' value='$ino'>Remove</button>
</p></td>
</tr>
<?php
$total = + $_SESSION ["amounts"] [$i];
}
$_SESSION ["total"] = $total;
?>
<tr>
<td colspan="2">Total: $<?php echo($total); ?></td>
<td><input type='submit' value='Checkout' /></td>
</tr>
<tr>
<td><button type='submit' name='clear'>Clear cart</button></td>
</tr>
</table>
</form>
<?php } ?>
您的脚本中有几处需要修复,所以我会将它们分解成各自的部分。
还有很多安全错误检查也应该用代码完成,但作为纯粹的学习练习,我绕过了这些因素。
定义购物车
您将购物车定义为数组:
if (! isset ( $_SESSION ['cart'] )) {
$_SESSION ['cart'] = array ();
}
但是,当您将商品添加到购物车时,您是在更换购物车:
// Add
if (isset ( $_POST ["buy"] )) {
$_SESSION ['cart'] = $_POST; //
}
要将商品添加 到购物车,您应该使用 $cart[] = $_POST
,但是,还有其他事项需要考虑。
加入购物车
当您只需要产品 ID 时,$cart[] = $_POST
将完整的 $_POST
数据添加到购物车。正确的方法是:
// Add
if (isset ( $_POST ["buy"] )) {
// Check the item is not already in the cart
if (!in_array($_POST ["buy"], $_SESSION['cart'])) {
// Add new item to cart
$_SESSION ['cart'][] = $_POST["buy"];
}
}
这将导致购物车存储多个值。例如,print_r($_SESSION['cart'])
可能显示:
array (
0 => 'A123',
1 => 'B456'
);
此数组中的每个项目都是已添加到您的购物车的项目。
正在从您的购物车中移除商品
现在 $_SESSION['cart']
的结构已经更改,"remove from cart" 操作也需要更新。使用
// Delete Item
else if (isset ( $_POST ['delete'] )) { // a remove button has been clicked
// Remove the item from the cart
if (false !== $key = array_search($_POST['delete'], $_SESSION['cart'])) {
unset($_SESSION['cart'][$key]);
}
}
检查商品是否在您的购物车中
需要对您的代码进行进一步更改以支持新的数组结构。您可以使用 in_array
检查您的产品是否包含在购物车数组中。
<?php
foreach ( $items as $ino => $item ) {
// ... snipped for brevity
// Check if an item is in the cart by checking for the existence of its ID:
if (in_array($ino, $_SESSION['cart'])) { // The $ino would be 'a123' for your first product
echo "<p><button type='submit' name='delete' value='$ino'>Remove</button></p>";
} else {
echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
}
}
?>
简化您的代码
在上面的代码中,我删除了一些代码。您正在执行以下操作:
$title = $item ['name'];
$desc = $item ['desc'];
$price = $item ['price'];
echo " <p>$title</p>";
echo " <p>$desc</p>";
echo "<p>$$price</p>";
这可以简化为:
echo "<p>$item['name']</p>";
echo "<p>$item['desc']</p>";
echo "<p>$$item['price']</p>";
我 个人 会使用:
而不是最后一行中的双重$$
echo '<p>$' . number_format($item['name']) . '</p>';
这使您可以更轻松地设置数字显示的格式。或者,您可以使用 money_format
.
显示购物车
此代码存在一些问题。
- 您正在尝试
echo($_SESSION['cart'])
,但这行不通。你不能echo
数组 - 您在尝试使用
<?php echo($_SESSION["price"][$i] ); ?>
显示值时错误地使用了 - 您正在使用于
$total
值的代码复杂化 - 由于随机
</p>
被混入 ,HTML 无效
foreach ($_SESSION ["cart"] as $i)
正确的显示方式是:
<?php
// Set a default total
$total = 0;
foreach ( $_SESSION['cart'] as $ino ) {
?>
<tr>
<td>
Name: <?php echo $items[$ino]['name']; ?>
</td>
<td>
Price: <?php echo $items[$ino]["price"]; ?>
</td>
<td>
<button type='submit' name='delete' value='<?php echo $ino; ?>'>Remove</button>
</td>
</tr>
<?php
$total += $items[$ino]['price'];
} // end foreach
?>
Total: $<?php echo $total; ?>