使用 PHP $_Session 和 NO SQL 创建单页购物车

Posted

技术标签:

【中文标题】使用 PHP $_Session 和 NO SQL 创建单页购物车【英文标题】:Create a one page shopping cart using PHP $_Session and NO SQL 【发布时间】:2017-06-17 20:09:46 【问题描述】:

我正在学习一些 php,我正在尝试创建一个多合一的购物车。

我已经阅读并看到了 SQL 基础系统的好处,但我想先学习基础知识。在这样做的过程中,我创建了一个包含关联数组中的产品的一体化页面,以及一个提交给自身的表单。

我想要实现的是:

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

我目前的问题是:

我一次不能购买超过一件商品,即购物车只包含最后购买的商品 我无法让它“检查”某件商品是否已购买,如果是,请将“购买”替换为“删除” 我无法在购物车中显示商品详情 结帐按钮未将任何详细信息传递给我的测试

同样,我还没有在寻找 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   ?>

【问题讨论】:

您一直在此行覆盖您的购物车内容$_SESSION ['cart'] = $_POST; 您需要将当前会话与$_POST 数组合并。 您没有使用 php 在此处回显:value='$ino',您将需要 value='&lt;?php echo $ino ?&gt;',尽管我看不到您在哪里设置 $ino。也许我只是想念它。我只在那个循环上面的循环中看到它......在那个循环中它不会按预期工作。 我添加了一个答案,它分解了所需的各种更新。如果我遗漏了什么或者您想进一步澄清,请告诉我。 【参考方案1】:

您的脚本中有一些需要修复的地方,所以我会将它们分解为各个部分。

还应该对代码进行很多安全错误检查,但作为纯粹的学习练习,我绕过了这些因素。

定义购物车

您将购物车定义为一个数组:

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'] 的结构已更改,“从购物车中删除”操作也需要更新。使用little snippet of code,我们可以检查该值是否存在于数组中,找到其键并将其删除。

// 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一个数组 您在尝试使用&lt;?php echo($_SESSION["price"][$i] ); ?&gt; 显示值时错误地使用了foreach ($_SESSION ["cart"] as $i) 您使用于$total 值的代码复杂化了 html 无效,因为随机添加了 &lt;/p&gt;

正确的显示方式是:

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

【讨论】:

非常感谢@Kirk Beard 的帮助,解释问题的原因/原因比提供解决方案要好得多。我真的很感谢你的努力!再次感谢! @Ben 不用担心 :) 你已经付出了努力学习,所以我很乐意一路努力帮助你。祝你好运!

以上是关于使用 PHP $_Session 和 NO SQL 创建单页购物车的主要内容,如果未能解决你的问题,请参考以下文章

PHP全局变量与SESSION 漏洞(global 与 session)

SQL注入之bWAPP之manual_interv.php

PHP使用cookie,session和SQL写登陆页面

AngularJS ngRoute 和 PHP $_SESSION 变量

Ajax、PHP、SQL 和 JavaScript

$_session (应用)