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

PHP表单提交无法新增Todo项:数组添加元素失效问题求助

问题:PHP Todo列表无法累加新任务,每次提交都会替换现有项

核心原因是PHP的无状态特性:每次HTTP请求都会重新执行整个脚本,你初始化的$todoList = ["Add a Task"];在每次提交后都会重置,新添加的元素仅在当前请求周期内有效,页面刷新后就会丢失,导致看起来像是“替换”而不是“添加”。

解决方向

1. 使用Session存储(最适合小型单用户Todo)

Session可以在请求之间保存用户数据,修改代码如下:

<?php
// 启动Session,必须放在脚本最开头
session_start();

// 从Session初始化列表,如果不存在则设置默认值
if (!isset($_SESSION['todoList'])) {
    $_SESSION['todoList'] = ["Add a Task"];
}
$todoList = $_SESSION['todoList'];

// 处理GET提交
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if (isset($_GET['user-input']) && !empty($_GET['user-input'])) {
        $newItem = htmlspecialchars($_GET['user-input'], ENT_QUOTES, 'UTF-8');
        $todoList[] = $newItem;
        // 把更新后的列表存回Session
        $_SESSION['todoList'] = $todoList;
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>My Todo List</title>
</head>
<body>
    <h1>Todo List</h1>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
        <input type="text" name="user-input" placeholder="Add a task">
        <button type="submit">Toevoegen</button>
    </form>

    <div class="todoList">
        <?php
        foreach ($todoList as $item){
            echo "<div>" . htmlspecialchars($item, ENT_QUOTES, 'UTF-8') . "</div>";
        }
        ?>
    </div>
</body>
</html>

2. 使用Cookie存储(适合少量数据)

将数组序列化后存入Cookie,读取时反序列化:

<?php
// 从Cookie初始化列表
if (isset($_COOKIE['todoList'])) {
    $todoList = unserialize($_COOKIE['todoList']);
} else {
    $todoList = ["Add a Task"];
}

// 处理GET提交
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if (isset($_GET['user-input']) && !empty($_GET['user-input'])) {
        $newItem = htmlspecialchars($_GET['user-input'], ENT_QUOTES, 'UTF-8');
        $todoList[] = $newItem;
        // 序列化后存入Cookie,设置过期时间(比如7天)
        setcookie('todoList', serialize($todoList), time() + 7*24*3600);
    }
}
?>

3. 使用数据库存储(适合持久化/多用户场景)

如果需要长期保存或支持多用户,建议使用MySQL等数据库:

  • 创建一个todos表,包含id(主键)、task(任务内容)、created_at(创建时间)等字段
  • 提交新任务时执行INSERT语句插入数据
  • 页面加载时执行SELECT语句查询所有任务并显示

说明

你尝试的foreach循环输出本身没有问题,问题出在数据没有在请求之间持久化。上述方法中,Session是最简单的单用户解决方案,数据库则是更健壮的持久化方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:05:14