You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP购物车始终为空:product.php与cart.php代码问题求助

购物车添加商品后$_SESSION['cart']为空的问题排查与解决

核心问题分析

你的代码存在几个关键问题导致商品无法添加到购物车:

  1. 提交按钮缺少name="submit"属性
    product.php中的提交按钮只有value没有name,导致isset($_POST['submit'])判断永远为false,不管是product.php还是cart.php里的添加逻辑都不会触发。

  2. 表单提交目标与处理逻辑不匹配
    product.php的表单action指向cart.php,但添加商品的处理逻辑却写在了product.php的表单内部,提交后直接跳转到cart.php,这段逻辑根本不会执行;同时cart.php里的添加逻辑也因为submit参数不存在而无法触发。

  3. cart.php中更新/删除功能的参数缺失
    更新按钮没有name="update",删除按钮没有对应的处理逻辑,不过这属于次要问题,先解决核心的添加功能。

修复方案

1. 修正product.php的提交按钮

给提交按钮添加name="submit",确保POST请求能携带submit参数:

<!-- product.php中的提交按钮修改为 -->
<input type="submit" name="submit" value="Ajouter au panier">

同时去掉product.php表单内的无效处理代码(因为表单提交到cart.php,逻辑移到cart.php处理):

<!-- 删除product.php表单内的这段代码 -->
<?php
if (isset($_POST['submit'])) {
$id = $_POST['product_id'];
$quantity = $_POST['quantity'];
addProductToCart($id, $quantity);
header('Location: cart.php');
exit;
}
?>

2. 确保cart.php正确处理添加请求

cart.php中已经有处理$_POST['submit']的逻辑,现在因为按钮添加了name,这段逻辑会正常触发。另外优化cart.php中的代码,避免未定义变量:

// 在cart.php的foreach前初始化$products数组
$products = [];
foreach ($_SESSION['cart'] as $item) {
    $product = findProductById($item['product_id']);
    $product->quantity = $item['quantity'];
    $products[] = $product;
}

3. 完善cart.php的更新与删除功能

给更新按钮添加name="update",给删除按钮添加name="delete",并补充删除逻辑:

<!-- cart.php中的表单修改为 -->
<form method="POST" id="update_cart_form" action="cart.php">
  <input type="hidden" name="id" value="<?= $id ?>">
  <h2><?= $product->short_name ?></h2>
  <label for="quantity" class="row">Quantité :</label>
  <input type="number" class="plaintext row" id="quantity" name="quantity" value="<?= $item['quantity'] ?>">
  <button type="submit" class="btn btn-link row" name="update">Mettre à jour</button>
  <button type="submit" class="btn btn-link row" name="delete">Supprimer</button>
</form>

然后在cart.php的PHP部分添加删除处理逻辑,并修正update逻辑的参数错误:

// 在cart.php的update逻辑后添加删除处理
if (isset($_POST['delete'])) {
    $product_id = $_POST['id'];
    unset($_SESSION['cart'][$product_id]);
}

// 修正cart.php中的update逻辑参数
if (isset($_POST['update'])) {
    $product_id = $_POST['id'];
    $quantity = $_POST['quantity'];

    if ($quantity <= 0) {
        unset($_SESSION['cart'][$product_id]);
    } else {
        $_SESSION['cart'][$product_id]['quantity'] = $quantity;
    }
}

完整修正代码

product.php

<?php

session_start();
if (!isset($_SESSION['user'])) {
  header('Location: login.php');
  exit;
}

if (!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = array();
}

require 'db.inc.php';


if (!isset($_GET['id'])) {
    header('Location: store.php');
    exit;
}


$product = findProductById($_GET['id']);

$features = findProductFeaturesById($_GET['id']);

if (!$product) {
    header('Location: store.php');
    exit;
}

?>
<!doctype html>
<html lang="fr">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Lab 3">
    <meta name="author" content="">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
</head>

<body class="">


    <header class="d-flex flex-wrap align-items-center justify-content-center justify-content-md-between py-3 mb-4 border-bottom">
        <a href="/" class="d-flex align-items-center col-md-3 mb-2 mb-md-0 text-dark text-decoration-none">
            <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap">
                <use xlink:href="#bootstrap"></use>
            </svg>
        </a>

        <ul class="nav nav-pills col-12 col-md-auto mb-2 justify-content-center mb-md-0">
            <li><a href="store.php" class="nav-link px-2 active">Le catalogue</a></li>
            <li><a href="cart.php" class="nav-link px-2">Mes achats</a></li>
        </ul>

        <div class="col-md-3 text-end me-1">
            <a class="btn btn-outline-primary" href="logout.php" role="button">Quitter</a>
        </div>
    </header>

    <main class="container">
        <nav aria-label="breadcrumb">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="store.php">Catalogue complet</a></li>
                <li class="breadcrumb-item active" aria-current="page"><?= $product->short_name ?></li>
            </ol>
        </nav>
        <div class="row">
            <div class="card mb-3 pb-6 col-6" style="width: 36rem;">
                <div class="card-body">
                    <div class="card-text">
                        <h1><?= $product->name ?></h1>
                    </div>
                    <div class="card-title display-2 text-end">
                        <?= $product->price ?>$
                    </div>
                </div>
            </div>
            <div class="col-2">
            </div>
            <div class="col-4">
                <p class="text-start h2 row"><?= $product->available_quantity ?> en stock</p>
            </div>
        </div>
       
        <h2>A propos de cet article</h2>
        <ul>
        <?php
        // Rajout des caractéristiques à partir de la fonction findProductFeaturesById //
        $features = findProductFeaturesById($product->id);
        foreach ($features as $feature) {
            echo '<li>' . $feature['feature'] . '</li>';
        }
        ?>
        </ul>
        <form action="cart.php" method="post">
            <input type="hidden" name="product_id" value="<?= $product->id ?>">
            <label for="quantity">Quantité:</label>
            <input type="number" name="quantity" value="1" min="1" max="<?= $product->available_quantity ?>">
            <input type="submit" name="submit" value="Ajouter au panier">
        </form>

    </main>

</body>

</html>

cart.php

<?php

session_start();

if (!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = array();
}

require 'db.inc.php';

if (isset($_POST['submit'])) {
    $product_id = $_POST['product_id'];
    $quantity = $_POST['quantity'];

    if (!isset($_SESSION['cart'][$product_id])) {
        $_SESSION['cart'][$product_id] = array(
            'product_id' => $product_id,
            'quantity' => $quantity
        );
    } else {
        $_SESSION['cart'][$product_id]['quantity'] += $quantity;
    }
}

if (isset($_POST['update'])) {
    $product_id = $_POST['id'];
    $quantity = $_POST['quantity'];

    if ($quantity <= 0) {
        unset($_SESSION['cart'][$product_id]);
    } else {
        $_SESSION['cart'][$product_id]['quantity'] = $quantity;
    }
}

if (isset($_POST['delete'])) {
    $product_id = $_POST['id'];
    unset($_SESSION['cart'][$product_id]);
}

$products = [];
foreach ($_SESSION['cart'] as $item) {
    $product = findProductById($item['product_id']);
    $product->quantity = $item['quantity'];
    $products[] = $product;
}

$cart = $_SESSION['cart'];

function addProductToCart($id, $quantity)
{
    if (isset($_SESSION['cart'][$id])) {
        $_SESSION['cart'][$id]['quantity'] += $quantity;
    } else {
        $_SESSION['cart'][$id] = array(
            'product_id' => $id,
            'quantity' => $quantity
        );
    }
}

// lorsque la quantité est 0, le produit est retiré du panier
function updateProductQuantity($id, $quantity)
{
    if ($quantity == 0) {
        unset($_SESSION['cart'][$id]);
    } else {
        $_SESSION['cart'][$id]['quantity'] = $quantity;
    }
}

?>
<!doctype html>
<html lang="fr">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Lab 4">
    <meta name="author" content="">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
</head>

<body class="">


    <header class="d-flex flex-wrap align-items-center justify-content-center justify-content-md-between py-3 mb-4 border-bottom">
        <a href="/" class="d-flex align-items-center col-md-3 mb-2 mb-md-0 text-dark text-decoration-none">
            <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap">
                <use xlink:href="#bootstrap"></use>
            </svg>
        </a>

        <ul class="nav nav-pills col-12 col-md-auto mb-2 justify-content-center mb-md-0">
            <li><a href="store.php" class="nav-link px-2">Le catalogue</a></li>
            <li><a href="#" class="nav-link px-2 active">Vos achats</a></li>
            <li><a href="orders.php" class="nav-link px-2">Vos commandes</a></li>
        </ul>

        <div class="col-md-3 text-end me-1">
            <a class="btn btn-outline-primary" href="logout.php" role="button">Quitter</a>
        </div>
    </header>

    <main class="container">
        <h1>Votre panier</h1>
        <?php if (count($_SESSION['cart']) != 0) :?>
        <div class="list-group mb-3">
            <?php foreach ($cart as $id => $item) : 
                    $product = findProductById($id);
            ?>
                <div class="list-group-item">
                <form method="POST" id="update_cart_form" action="cart.php">
                    <input type="hidden" name="id" value="<?= $id ?>">
                    <h2><?= $product->short_name ?></h2>
                    <label for="quantity" class="row">Quantité :</label>
                    <input type="number" class="plaintext row" id="quantity" name="quantity" value="<?= $item['quantity'] ?>">
                    <button type="submit" class="btn btn-link row" name="update">Mettre à jour</button>
                    <button type="submit" class="btn btn-link row" name="delete">Supprimer</button>
                </form>
                </div>
            <?php endforeach; ?>
        </div>
        
        <form method="POST" id="pay_cart_form" action="orders.php">
            <button type="submit" class="btn btn-primary" name="action" value="pay_cart">Payer maintenant</button>
        </form>

        <?php else :?>
        <p>Votre panier est vide!</p>
        <?php endif;?>
        
    </main>
</body>

</html>

内容的提问来源于stack exchange,提问作者Sami Begah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:20:41