PHP购物车始终为空:product.php与cart.php代码问题求助
购物车添加商品后
$_SESSION['cart']为空的问题排查与解决 核心问题分析
你的代码存在几个关键问题导致商品无法添加到购物车:
提交按钮缺少
name="submit"属性
product.php中的提交按钮只有value没有name,导致isset($_POST['submit'])判断永远为false,不管是product.php还是cart.php里的添加逻辑都不会触发。表单提交目标与处理逻辑不匹配
product.php的表单action指向cart.php,但添加商品的处理逻辑却写在了product.php的表单内部,提交后直接跳转到cart.php,这段逻辑根本不会执行;同时cart.php里的添加逻辑也因为submit参数不存在而无法触发。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
相关产品推荐
相关产品推荐

