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

PHP购物车添加商品异常:仅显示‘1=0’无商品信息求助

问题排查与解决:PHP购物车仅显示"1 = 0"无法展示商品信息

核心问题拆解

页面显示1 = 0的本质是:商品名称为空(无输出)、数量取了默认值1,但价格为0,最终总价计算为0。根源是商品核心参数(名称、价格)未正确传递到购物车逻辑,同时代码存在几处关键细节错误。

分步修复方案

1. 修正Session启动顺序

init.inc.php中session_start()必须放在所有输出(包括隐性输出如空格、换行)之前,当前代码先连接数据库再启动Session,若数据库连接代码存在隐性输出,会直接导致Session无法正常初始化,变量无法存入$_SESSION:

<?php
// 优先启动Session,必须放在文件最顶部
session_start();

// 再执行数据库连接
$pdoBlog = new PDO(
        'mysql:host=localhost;dbname=onye',
        'root',
        'root',
        array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
        )
    );

// 提示信息变量
$contenu = '';

// 引入函数文件
require_once 'functions.inc.php';
?>

2. 重构商品参数传递逻辑(杜绝前端依赖)

你的表单依赖$_GET传递商品名称、价格,但跳转至购物车页面时这些$_GET参数可能丢失,且前端参数可被恶意篡改。建议改为仅传递商品ID,从数据库拉取真实商品信息:

  • 修改购物车页面的添加逻辑:
if (isset($_POST['add_to_cart'])) {
    $product_id = $_POST['product_id'];
    $quantity = intval($_POST['quantity']);

    // 从数据库获取真实商品信息,避免前端传值风险
    $stmt = $pdoBlog->prepare("SELECT product_name, price FROM products WHERE product_id = ?");
    $stmt->execute([$product_id]);
    $product = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($product) {
        $product_data = array(
            'product_id' => $product_id,
            'product_name' => $product['product_name'],
            'price' => $product['price'],
            'quantity' => $quantity
        );
        $_SESSION['cart'][$product_id] = $product_data;
    } else {
        echo "指定商品不存在";
    }
}
  • 简化表单,仅传递商品ID:
<form method="POST" action="cart.php">
    <input type="hidden" name="product_id" value="<?php echo $_GET["product_id"]; ?>">
    <label>Quantity: </label>
    <input type="number" name="quantity" value="1" min="1">
    <button type="submit" name="add_to_cart">Add to Cart
        <?php
        $cart_count = isset($_SESSION['cart']) ? count($_SESSION['cart']) : 0;
        echo "($cart_count)";
        ?>
    </button>
</form>

3. 修正总价计算的优先级错误

字符串拼接时,乘法运算优先级低于字符串连接,必须用括号包裹计算逻辑,否则会先拼接字符串再执行乘法,导致结果异常:

foreach ($_SESSION['cart'] as $product) {
    $total = floatval($product['price']) * intval($product['quantity']);
    echo "<p class=\"text-dark\">" . 
        $product['product_name'] . " × " . 
        $product['quantity'] . " = " . 
        number_format($total, 2) . 
        "</p>";
}

4. 调试参数有效性

在购物车页面顶部添加调试代码,确认参数是否正确接收:

// 查看POST提交的参数
var_dump($_POST);
// 查看购物车Session存储的数据
var_dump($_SESSION['cart']);

额外优化建议

  • 禁止依赖前端传递商品价格、名称等敏感信息,必须从数据库获取,防止恶意篡改价格
  • 保留错误提示(error_reporting(E_ALL); ini_set('display_errors', 1);),注意查看页面顶部是否有Session启动失败的警告(如headers already sent)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:43