You need to enable JavaScript to run this app. PHP OOP练习:如何将表单数据转为对象存入数组实现产品库存管理
优惠活动
大模型
产品
解决方案
定价
更多

PHP OOP练习:如何将表单数据转为对象存入数组实现产品库存管理

代码修改方案

问题根因

你当前的代码存在两个核心问题:

  1. 直接将单个产品对象赋值给$_SESSION["prod"],每次提交都会覆盖旧数据,没有用数组存储多个产品
  2. 构造方法已经完成了属性赋值,后续重复调用set方法属于冗余代码,且没有对SESSION变量做初始化,容易出现未定义变量警告

完整修改后的处理代码

<?php
// 启动会话必须放在代码最顶部
session_start();
include_once "product.php";

// 初始化存储产品的会话数组,仅首次访问时执行
if (!isset($_SESSION['prod_list'])) {
    $_SESSION['prod_list'] = [];
}
$max_product_limit = 50;

// 添加产品逻辑
if (isset($_POST["add"])) {
    $current_count = count($_SESSION['prod_list']);
    if ($current_count >= $max_product_limit) {
        echo "错误:最多仅支持添加50个产品";
        exit;
    }
    // 构造方法直接赋值,无需重复调用set方法
    $new_prod = new Product(
        (int)$_POST["key"],
        trim($_POST["description"]),
        (float)$_POST["price"],
        (int)$_POST["stock"]
    );
    // 追加到数组末尾,不会覆盖原有数据
    $_SESSION['prod_list'][] = $new_prod;
    echo "产品添加成功,当前已添加" . ($current_count + 1) . "个产品";
}

// 列出所有产品逻辑
if (isset($_POST["list"])) {
    if (empty($_SESSION['prod_list'])) {
        echo "当前没有录入任何产品";
        exit;
    }
    echo "<h4>产品列表</h4>
    <table border='1' cellpadding='6' cellspacing='0'>
        <tr><th>产品键号</th><th>产品描述</th><th>价格</th><th>库存</th></tr>";
    foreach ($_SESSION['prod_list'] as $prod) {
        echo "<tr>
            <td>{$prod->getKey()}</td>
            <td>{$prod->getDescription()}</td>
            <td>{$prod->getPrice()}</td>
            <td>{$prod->getStock()}</td>
        </tr>";
    }
    echo "</table>";
}

// 删除产品逻辑(按表单输入的产品键号匹配删除)
if (isset($_POST["baja"])) {
    $target_key = (int)$_POST["key"];
    foreach ($_SESSION['prod_list'] as $index => $prod) {
        if ($prod->getKey() === $target_key) {
            unset($_SESSION['prod_list'][$index]);
            // 重置数组索引,避免后续操作出现索引异常
            $_SESSION['prod_list'] = array_values($_SESSION['prod_list']);
            echo "键号为{$target_key}的产品已删除";
            exit;
        }
    }
    echo "未找到键号为{$target_key}的产品";
}

// 按产品键号升序排序逻辑
if (isset($_POST["Sort"])) {
    usort($_SESSION['prod_list'], function ($a, $b) {
        return $a->getKey() - $b->getKey();
    });
    echo "已按产品键号升序排序完成,点击列表按钮可查看排序结果";
}

// 退出逻辑:清空会话数据
if (isset($_POST["exit"])) {
    session_unset();
    session_destroy();
    echo "已退出,所有临时产品数据已清空";
}
?>

关键调整说明

  • 存储结构调整:使用$_SESSION['prod_list']数组存储所有产品对象,通过[]语法追加新元素,避免覆盖旧数据
  • 冗余代码删除:构造方法已经传入参数完成属性赋值,删除了重复调用set方法的冗余代码
  • 变量初始化:首次访问时初始化产品数组和上限变量,避免未定义变量警告
  • 功能补全:完整实现了添加、删除、列表、排序、退出五个要求的功能
  • 类型校验:对输入的键号、价格、库存做了强制类型转换,避免类型不一致导致的逻辑错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 11:45:05