PHP开发社交媒体feed时如何让echo输出内容永久保留不被替换
解决方案
问题根因
- 无历史数据存储逻辑:PHP是无状态的,单次请求结束后不会自动保留之前提交的内容,你当前的代码仅输出当次提交的单条帖子,所以看不到历史内容
- 样式堆叠问题:
.post类设置了固定坐标的绝对定位,即便输出多条帖子也会全部叠在同一个位置,视觉上表现为旧内容被新内容替换
修复后完整代码
<?php // 开启Session用于存储当前会话的历史帖子 session_start(); // 初始化存储帖子的Session数组 if (!isset($_SESSION['posts'])) { $_SESSION['posts'] = []; } // 处理提交逻辑 if (isset($_POST['submit']) && !empty($_POST['post'])) { // 转义用户输入避免XSS攻击 $new_post = htmlspecialchars(trim($_POST['post'])); // 把新帖子加到历史数组头部(最新的在最上面) array_unshift($_SESSION['posts'], $new_post); } ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Feed</title> <style> body { background-color : white; position: relative; } /* 帖子列表容器,放在左侧 */ .post-list { position: absolute; left: 0; top: 100px; width: 420px; } .post { width: 300px; border: 4px solid black; padding: 50px; margin: 20px 0; } .textarea { position: absolute; left: 600px; } .button { position: absolute; left: 900px; top: 50px; } </style> </head> <body> <form action="" method="post"> <textarea class="textarea" cols="30" rows="5" name="post"></textarea> <input class="button" type="submit" name="submit" value="发布" id="submit"> </form> <!-- 输出所有历史帖子 --> <div class="post-list"> <?php foreach ($_SESSION['posts'] as $post_item): ?> <div class='post'><?= $post_item ?></div> <?php endforeach; ?> </div> </body> </html>
补充说明
如果需要实现永久存储(关闭浏览器重新打开仍能看到历史帖子),可以将存储逻辑从Session改为写入本地文件或者存入MySQL等数据库即可,当前方案的Session存储仅在当前用户的会话周期内有效。
内容的提问来源于stack exchange,提问作者George Developer
相关产品推荐
相关产品推荐

