首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP $_Session而不使用SQL创建一页购物车。

使用PHP $_Session而不使用SQL创建一页购物车。
EN

Stack Overflow用户
提问于 2017-02-01 06:55:33
回答 1查看 4.9K关注 0票数 1

我正在学习一些PHP,我试图在一个页面中创建一个全部的购物车。

我已经阅读了SQL系统的优点,并且可以看到它的好处,但我想先学习基本知识。在此过程中,我创建了一个包含相关数组中的产品的全合一页面,以及一个提交给自己的表单。

我想要实现的是:

  • 产品只能购买一次(用移除按钮替换购买按钮)
  • 项目及其成本添加到下面的购物车中。
  • 用户可以将其从购物车中删除,也可以从项目列表中删除。
  • 总费用应根据需要更新。
  • “结帐”按钮将提交项目名称和成本。
  • 表单会自动发布,并且不需要任何SQL。

我目前的问题是:

  • 我一次不能购买多个商品,即购物车只包含上次购买的物品。
  • 我无法让它“检查”一个项目是否已经购买,如果是,将“购买”改为“删除”。
  • 我无法在购物车中显示项目细节。
  • 结帐按钮不会将任何细节传递给我的测试。

同样,我还没有寻找一个SQL解决方案,只是一个使用$_SESSION$_POST的纯PHP,并且希望使用按钮而不是<a href add?>类型的链接。

谢谢您事先阅读了很长时间,下面是代码:

代码语言:javascript
复制
<?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  } ?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 07:18:05

在您的脚本中有一些东西需要修复,所以我会将它们分解为它们各自的部分。

有很多安全错误检查也应该用代码来完成,但是作为一个纯粹的学习练习,我绕过了这些因素。

定义手推车

将购物车定义为数组:

代码语言:javascript
复制
if (! isset ( $_SESSION ['cart'] )) {
    $_SESSION ['cart'] = array ();
}

但是,当您向购物车添加项目时,您要替换购物车:

代码语言:javascript
复制
// Add
if (isset ( $_POST ["buy"] )) {
    $_SESSION ['cart'] = $_POST; // 
} 

要将一项添加到购物车中,您应该使用$cart[] = $_POST,但是,还需要考虑其他一些事情。

添加到购物车

当您只需要产品ID时,$cart[] = $_POST会将完整的$_POST数据添加到购物车中。

代码语言:javascript
复制
// 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'])可能会显示:

代码语言:javascript
复制
array (
    0 => 'A123',
    1 => 'B456'
);

此数组中的每个项都是添加到购物车中的项。

从手推车中移除物品

现在$_SESSION['cart']的结构已经改变了,“从购物车中移除”操作也需要更新。使用little snippet of code,我们可以检查该值是否存在于数组中,找到它的键并删除它。

代码语言:javascript
复制
// 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检查产品是否包含在cart数组中。

代码语言:javascript
复制
<?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> ";
        }
    }
?>

简化代码

在上面的代码中,我删除了一些代码。你正在做以下工作:

代码语言:javascript
复制
$title = $item ['name'];
$desc = $item ['desc'];
$price = $item ['price'];

echo " <p>$title</p>";
echo " <p>$desc</p>";
echo "<p>\$$price</p>";

这可以简化为:

代码语言:javascript
复制
echo "<p>$item['name']</p>";
echo "<p>$item['desc']</p>";
echo "<p>\$$item['price']</p>";

与其在最后一行中使用双$$,我个人还会使用:

代码语言:javascript
复制
echo '<p>$' . number_format($item['name']) . '</p>';

这使您可以更容易地格式化数字的显示。或者,您可以使用money_format

展示购物车

这段代码有一些问题。

  1. 你在尝试echo($_SESSION['cart']),这是行不通的。不能echo数组
  2. 当试图使用foreach ($_SESSION ["cart"] as $i)显示值时,使用<?php echo($_SESSION["price"][$i] ); ?>是错误的
  3. 您正在使用于$total值的代码复杂化
  4. 由于向混合文件中随机抛出了一个</p>,所以HTML无效

正确的显示方式是:

代码语言:javascript
复制
<?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; ?>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41973682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档