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

基于PHP实现扫码添加商品至购物车的技术求助

问题描述

我正在尝试创建一个包含购物车的单页页面,希望通过扫描条形码添加商品(仅需支持5款商品),但始终无法成功。我掌握数据库连接方法,但PHP知识较为匮乏,预期商品以HTML表格形式展示,目前无任何效果。

我尝试的代码

数据库建表与插入数据

CREATE TABLE Products (
  ProductID INT PRIMARY KEY,
  ProductName VARCHAR(50),
  Barcode VARCHAR(50)
);
INSERT INTO Products (ProductID, ProductName, Barcode)
VALUES (1, 'Product A', '1234567890123'),
       (2, 'Product B', '2345678901234'),
       (3, 'Product C', '3456789012345'),
       (4, 'Product D', '4567890123456'),
       (5, 'Product E', '5678901234567');

前端表单页面(index.php)

<form method="post" action="scan.php">
  <label>Scan Barcode:</label>
  <input type="text" name="barcode">
  <input type="submit" value="Submit">
</form>

处理扫描的PHP页面(scan.php)

<?php
// Connect to the database
$pdo = new PDO("mysql:host=localhost;dbname=your_database_name", "username", "password");

// Retrieve the barcode value from the form
$barcode = $_POST['barcode'];

// Prepare the SQL query to retrieve the product based on the barcode
$sql = "SELECT * FROM products WHERE barcode = :barcode";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':barcode', $barcode);
$stmt->execute();

// Check if there are any results
if ($stmt->rowCount() > 0) {
  // Start the HTML table
  echo "<table>";
  echo "<tr><th>Product Name</th><th>Product Description</th><th>Product Price</th></tr>";
  
  // Loop through the results and add each product as a row in the table
  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "<tr>";
    echo "<td>" . $row['name'] . "</td>";
    echo "<td>" . $row['description'] . "</td>";
    echo "<td>$" . $row['price'] . "</td>";
    echo "</tr>";
  }
  
  // End the HTML table
  echo "</table>";
} else {
  // Display an error message if no results were found
  echo "No products found for barcode: " . $barcode;
}
?>

问题分析与修复方案

核心问题

  1. 数据库字段不匹配:你的Products表只有ProductID、ProductName、Barcode三个字段,但PHP代码中尝试读取name、description、price这些不存在的字段,这会导致输出为空或报错。
  2. 缺少购物车会话机制:当前代码只是查询商品,没有将商品添加到购物车的逻辑,也没有保存购物车状态的处理。
  3. 单页体验缺失:表单提交后跳转到scan.php,无法在同一个页面展示购物车,不符合单页需求。

修复后的完整代码

1. 修正数据库表(可选,添加必要字段)

如果需要展示描述和价格,先更新数据库:

ALTER TABLE Products ADD COLUMN ProductDesc VARCHAR(255) DEFAULT '暂无描述';
ALTER TABLE Products ADD COLUMN ProductPrice DECIMAL(10,2) DEFAULT 0.00;

-- 更新现有商品数据
UPDATE Products SET ProductDesc='商品A描述', ProductPrice=9.99 WHERE ProductID=1;
UPDATE Products SET ProductDesc='商品B描述', ProductPrice=19.99 WHERE ProductID=2;
UPDATE Products SET ProductDesc='商品C描述', ProductPrice=29.99 WHERE ProductID=3;
UPDATE Products SET ProductDesc='商品D描述', ProductPrice=39.99 WHERE ProductID=4;
UPDATE Products SET ProductDesc='商品E描述', ProductPrice=49.99 WHERE ProductID=5;

2. 单页版购物车页面(index.php,整合表单与购物车展示)

<?php
session_start();
// 初始化购物车会话
if (!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = [];
}

// 数据库连接
$pdo = new PDO("mysql:host=localhost;dbname=your_database_name", "username", "password");

// 处理条码提交
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['barcode'])) {
    $barcode = $_POST['barcode'];
    $sql = "SELECT * FROM Products WHERE Barcode = :barcode";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':barcode', $barcode);
    $stmt->execute();
    $product = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($product) {
        // 添加到购物车,处理重复商品
        $exists = false;
        foreach ($_SESSION['cart'] as &$item) {
            if ($item['ProductID'] == $product['ProductID']) {
                $item['quantity']++;
                $exists = true;
                break;
            }
        }
        if (!$exists) {
            $product['quantity'] = 1;
            $_SESSION['cart'][] = $product;
        }
    } else {
        $error = "未找到对应条码的商品: $barcode";
    }
}

// 处理移除商品
if (isset($_GET['remove'])) {
    $removeId = $_GET['remove'];
    $_SESSION['cart'] = array_filter($_SESSION['cart'], function($item) use ($removeId) {
        return $item['ProductID'] != $removeId;
    });
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>条码扫描购物车</title>
    <style>
        table { border-collapse: collapse; width: 80%; margin: 20px 0; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        .error { color: red; }
    </style>
</head>
<body>
    <h1>条码扫描添加商品</h1>
    <form method="post">
        <label>扫描条码:</label>
        <input type="text" name="barcode" autofocus>
        <input type="submit" value="添加到购物车">
    </form>
    
    <?php if (isset($error)): ?>
        <p class="error"><?php echo $error; ?></p>
    <?php endif; ?>
    
    <h2>购物车</h2>
    <?php if (!empty($_SESSION['cart'])): ?>
        <table>
            <tr>
                <th>商品名称</th>
                <th>描述</th>
                <th>价格</th>
                <th>数量</th>
                <th>小计</th>
                <th>操作</th>
            </tr>
            <?php $total = 0; ?>
            <?php foreach ($_SESSION['cart'] as $item): ?>
                <?php $subtotal = $item['ProductPrice'] * $item['quantity']; $total += $subtotal; ?>
                <tr>
                    <td><?php echo $item['ProductName']; ?></td>
                    <td><?php echo $item['ProductDesc']; ?></td>
                    <td>$<?php echo number_format($item['ProductPrice'], 2); ?></td>
                    <td><?php echo $item['quantity']; ?></td>
                    <td>$<?php echo number_format($subtotal, 2); ?></td>
                    <td><a href="?remove=<?php echo $item['ProductID']; ?>">移除</a></td>
                </tr>
            <?php endforeach; ?>
            <tr>
                <td colspan="4" align="right"><strong>总计:</strong></td>
                <td><strong>$<?php echo number_format($total, 2); ?></strong></td>
                <td></td>
            </tr>
        </table>
    <?php else: ?>
        <p>购物车为空</p>
    <?php endif; ?>
</body>
</html>

说明

  • 使用session_start()维护购物车状态,刷新页面或提交表单后购物车内容不会丢失。
  • 整合表单与购物车展示,实现单页操作,无需跳转。
  • 处理重复商品添加(数量递增),并支持移除商品。
  • 修正数据库字段匹配问题,使用正确的字段名ProductName、ProductDesc、ProductPrice。
  • 添加基础样式,让表格展示更清晰。

内容的提问来源于stack exchange,提问作者Ali Zbib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:24:55