【问题标题】:(PHP) Shopping Cart(PHP) 购物车
【发布时间】:2020-11-12 00:35:10
【问题描述】:

我正在尝试使用 PHP 创建一个购物车,但是,一旦用户离开购物车区域,所有产品都会消失。这就是我想要做的:

  <?php foreach($almofadas as $almofadas):?>
            <form action="cart.php" method="GET">
            <div class="base col-6 col-sm-4 col-md-5 col-lg-4 col-xl-4">
                <div class="card">
                    <img src="uploads/<?php echo $almofadas['imagem'];  ?>" alt="">
                        <div class="content-c">
                            <div class="row-p">
                                <div class="details">

                                    <span><?php echo $almofadas['pnome'] ; ?></span>
                                </div>
                                <div class="price">R$ <?php echo $almofadas['preço'];?> </div>
                            </div>
                            <input type="hidden" name="id" value="<?php echo $almofadas['p_id']?>">

                            <div style="margin-top: 10px;">
                                <div style="margin-bottom: 5px;"><button class="buttons-1" data-toggle="modal" data-target="#myModal">Detalhes</button></div>
                                <div><button class="buttons-2" type="submit">Adicionar ao Carrinho</a> </button></div> 
                            </div>
                        </div>
                </div>
            </div>
            </form>

        <?php endforeach;  ?>

现在的购物车系统:

<?php
session_start();


require_once 'conn.php';



$_SESSION['id'] =  $_GET['id'];
$result_pedido = "SELECT * FROM tb_produtos WHERE p_id = '{$_SESSION['id']}'"; 
$resultado_pedido = mysqli_query($conn, $result_pedido);
$pedidos = mysqli_fetch_all($resultado_pedido, MYSQLI_ASSOC);
    
?>

在这里我只能添加一个产品,我不能将它保存到 $_SESSION 中,因为我说一旦我离开购物车,产品就会消失。

<?php foreach($pedidos as $pedidos):?>
            <tr>
                <td>
                    <div class="cart-img">
                        <img src="uploads/<?php echo $pedidos['imagem'];?>" width="125px">
                    </div>
                </td>
                <td>
                    <div class="cart-model">
                        <?php echo $pedidos['pnome'] ; ?>
                    </div>
                </td>
                <td>
                    <div class="cart-quantity">
                        <input class="i-quantity" type="number" value="1">
                    </div>
                </td>
                <td>
                    <div class="cart-price">
                        R$<?php echo $pedidos['preço'] ; ?>
                    </div>
                </td>
            </tr>
        </tbody>
    </table>
    <?php endforeach; ?>

【问题讨论】:

  • 警告:使用mysqli 时,您应该使用parameterized queries 和bind_param 将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug。 切勿将$_POST、$_GET或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 这是学术代码还是用于生产站点?如果是为了学习,这里有很多重要的事情需要学习。如果是用于生产站点,这会很麻烦,您应该考虑在 Magento 或 Laravel 等已建立的平台上构建。
  • 你能解释一下你提到标签的部分吗?
  • 我们在这里看不到问题...打开(预加载)选项卡或离开它会调用脚本还是与 Sessions 或 DB 有关系?只是一个提示:)

标签: php html mysql mariadb


【解决方案1】:

如果你检查这一行:

$_SESSION['id'] =  $_GET['id'];

这意味着$_SESSION 中的“id”始终设置为$_GET['id'],即使它为空。所以每次用户访问页面时都会重置。

你应该:

  1. 有一些机制来存储您的购物车内容。您的代码中没有;和
  2. 有办法在将新 ID 存储到购物车之前检查用户是否访问了它。

例如,

<?php

/**
 * This only make sense if this script is called
 * by some AJAX / javascript interaction to specifically
 * add a new item to cart.
 */

session_start();

require_once 'conn.php';

if (isset($_GET['id']) && !empty($_GET['id'])) {
  $_SESSION['id'] =  $_GET['id'];
}

$result_pedido = "SELECT * FROM tb_produtos WHERE p_id = '{$_SESSION['id']}'"; 
$resultado_pedido = mysqli_query($conn, $result_pedido);
$pedidos = mysqli_fetch_all($resultado_pedido, MYSQLI_ASSOC);

// If the user visits a path where the $_GET['id'] have result in
// database and the user specified that he / she want to save something
// to his / her cart.
if (isset($_GET['id']) && !empty($_GET['id']) && !empty($pedidos)) {
    if (!isset($_SESSION['cart'])) $_SESSION['cart'] = []; // initialize if not exists.
    $_SESSION['cart'] = array_merge($_SESSION['cart'], $pedidos);
}
  
?>

注意:数量应该以某种方式设置到购物车。您需要更改数据结构以设置或增加“数量”。但这至少是一个开始。

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 2012-04-10
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多