您好!欢迎访问家园网-www.jy.wang!

家园网

查看所有转发微博forward.php代码讲解

网络 作者:本站 点击:

<?php
    require('library/Db.class.php');//连接数据库
    require("function.php");   //自定义函数
    require('library/page.class.php'); //分页类
    is_login(); //判断是否登录
    $db = new Db(); //实例化PDO操作类
    /** 查找微博原文 **/
    $post_id    = $_GET['post_id']; //获取post_id
    $post_info  = $db->row("SELECT * FROM mr_post  where 
                   id = :post_id",array('post_id'=>$post_id)); //查找post_id的微博内容
    $avatar     = get_user_avatar($post_info['user_id']); //获取用户头像
    $post_info['avatar'] = $avatar; //头像赋值
    //收藏
    $status    = $db->single('select status from mr_collect where user_id = :user_id and post_id = :post_id',array('user_id'=>$post_info['user_id'],'post_id'=>$post_info['id']));
    $post_info['collect'] = $status ? $status : 0;
    //图片数据格式由字符串转化为数组
    if($post_info['pictures']){
        $post_info['pictures'] = explode(',',$post_info['pictures']);
    }
    //如果转发
    if(isset($post_info['pid']) && $post_info['post_type'] == 2){
        $parent  = array();
        $content = '';
        $pid     = $post_info['pid'];
        $parent  = $db->row('select * from mr_post where id = '.$pid);//查找父级
        do{
            if(isset($parent) && $parent['post_type'] == 2){
                //拼接@内容
                $content = '@'.$parent['username'].':'.$parent['content'].'//'.$content;
                //查找父级
                $parent  = $db->row('select * from mr_post where id = '.$parent['pid']);                $flag = true;
            }else{
                //图片数据格式由字符串转化为数组
                if($parent['pictures']){
                    $parent['pictures'] = explode(',',$parent['pictures']);
                }
                $sub['parent'] = $parent;
                $flag = false;
            }
        }while($flag === true);
        $sub['content'] = substr($content,0,-2);
        $post_info['sub'] = $sub;
    }
    /** 查找该微博的回复 **/
    $showrow = 5; //一页显示的行数
    $curpage = empty($_GET['page']) ? 1 : $_GET['page']; //当前的页,还应该处理非数字的情况
    $url = "?page={page}&post_id=".$post_id; //分页地址,如果有检索条件 ="?page={page}&q=".$_GET['q']
    $total = $db->single('select count(*) from mr_post where pid = :post_id and post_type = 2',array('post_id'=>$post_id));
    if (!empty($_GET['page']) && $total != 0 && $curpage > ceil($total / $showrow)) {
        $curpage = ceil($total_rows / $showrow); //当前页数大于最后页数,取最后一页
    }
    //获取所有回复数据
    $sql  = "SELECT * FROM mr_post where pid = :post_id and post_type = 2 ORDER BY addtime DESC";
    $sql .= " LIMIT " . ($curpage - 1) * $showrow . ",$showrow;";
    $forward = $db->query($sql,array('post_id'=>$post_id));
    foreach($forward as $vo){
        $vo['avatar']  = $db->single('select avatar from mr_user where id = :user_id',array('user_id'=>$vo['user_id']));
        $lists[]       = $vo;
    }
    include 'view/forward-list.php';


如果转发这一段落的解析:


代码功能概述

这是一个处理微博/帖子转发功能的PHP逻辑,主要实现:

  1. 递归查找所有父级转发记录

  2. 拼接完整的转发链内容

  3. 处理图片数据格式转换

逐行解析

  1. if(isset($post_info['pid']) && $post_info['post_type'] == 2){
    • 条件判断:检查当前帖子是否有父级ID且类型为转发

    • $post_info['pid']:父级帖子ID

    • $post_info['post_type'] == 2:类型标识符,2代表转发

  2. $parent = array(); $content = '';
    • 初始化变量:

      $parent:存储父级帖子信息的数组

      $content:用于拼接转发链内容的字符串

  3. $pid = $post_info['pid'];
    • 将父级ID赋值给$pid变量

  4. $parent = $db->row('select * from mr_post where id = '.$pid);
    • 数据库查询:根据$pid查找父级帖子的完整信息

    • $db->row():假设为自定义的数据库查询方法

  5. do{...}while($flag === true);
    • 循环结构:只要$flag为true就继续循环

  6. if(isset($parent) && $parent['post_type'] == 2){
    • 判断当前父级是否存在且是否为转发类型

  7. $content = '@'.$parent['username'].':'.$parent['content'].'//'.$content;
    • 内容拼接:

      @:转发标识

      $parent['username']:原作者用户名

      $parent['content']:原内容

      //:分隔符

      递归拼接所有转发层级

  8. $parent = $db->row('select * from mr_post where id = '.$parent['pid']);
    • 继续查找当前父级的父级

  9. $flag = true;
    • 设置循环继续标志

  10. else{...}
    • 处理非转发类型的情况

  11. if($parent['pictures']){ $parent['pictures'] = explode(',',$parent['pictures']); }
    • 图片数据处理:

      检查图片字段是否存在

      用逗号分隔字符串转为数组

  12. $sub['parent'] = $parent; $flag = false;
    • 构建子对象:

      存储父级信息

      终止循环

  13. $sub['content'] = substr($content,0,-2);
    • 内容修正:

      移除末尾多余的//分隔符

  14. $post_info['sub'] = $sub;
    • 将处理结果存入原帖子信息 


以更精细的粒度重新解析这段PHP转发逻辑代码

采用分层拆解的方式:

  1. 核心逻辑结构
    这是一个典型的"递归查找+内容拼接"算法,用于构建微博/论坛的转发链。主要包含:

  • 条件判断层(入口过滤)

  • 循环处理层(递归查找)

  • 数据处理层(内容格式化)

  1. 变量作用域详解

  • $post_info:输入参数,包含:

    • pid:父级帖子ID(必需)

    • post_type:2表示转发类型

    • 其他帖子元数据

  • $parent:临时存储当前处理的父级帖子数据

  • $content:动态构建的转发内容链

  • $flag:循环控制开关

  1. 数据库交互细节

  • $db->row() 方法推测执行SQL查询:

SELECT * FROM mr_post WHERE id = [父级ID]
  • 查询结果包含字段:

    • username:原作者名

    • content:帖子正文

    • pictures:逗号分隔的图片ID字符串

    • pid:更上一级的父ID

  1. 内容拼接算法
    采用"头插法"构建转发链:
    原始内容:A
    转发B: @A:内容A // [原内容B]
    转发C: @B:内容B // @A:内容A // [原内容C]

  2. 图片数据处理

  • 字符串转数组逻辑:

"img1,img2,img3" → ["img1", "img2", "img3"]
  • 使用explode()函数按逗号分割

  1. 边界条件处理

  • 终止条件:当发现某个父级不是转发类型(post_type≠2)

  • 内容修正:substr($content,0,-2) 移除末尾多余的"//"

  1. 输出结构
    最终生成$post_info['sub']包含:

[
  'parent' => [最后一个非转发父级的完整数据],
  'content' => '完整转发链内容' 
]

需要重点理解的三个关键点:

  1. 递归查找通过do-while实现,而非函数递归

  2. 内容拼接是逆向构建(从最新转发向原始内容)

  3. 图片数据只在最原始帖子(非转发)时处理


能再详细解释一次吗?


我将以"手术式"的精细度重新解析这段PHP转发逻辑代码,采用解剖学式的分层讲解:

  1. 基因层(输入结构)
    $post_info必须包含:


  • ['post_type']:

    • 2=转发类型(类似微博的"转推")

    • 其他=原创内容


  1. 血液循环系统(主逻辑流程)
    ① 条件检测 → ② 初始化循环 → ③ 递归查询 → ④ 内容组装 → ⑤ 数据格式化 → ⑥ 结果存储

  2. 器官功能分解
    3.1 条件检测器官

  3. if(isset(post_info['pid']) && post_info['post_type'] == 2)
  • isset()安全检查:防止未定义索引错误

  • ==2类型检查:确保只处理转发内容

3.2 循环控制中枢

do{...}while($flag === true)
  • 特点:至少执行一次的后检测循环

  • 退出条件:$flag被设为false

  • 优势:比递归函数更节省内存

  1. 神经网络(数据处理细节)
    4.1 内容拼接算法
    content=@.parent['username'].':'.parent[content].//.content;

  • 逆向构建:新内容总是加在头部

  • 分隔符:使用"//"作为转发层级分隔

  • 作者标记:@username标注内容来源

4.2 图片数据处理

  $content = '@'.$parent['username'].':'.$parent['content'].'//'.$content;

parent[pictures]=explode(,,

  • 原始格式:"img1,img2,img3"

  • 转换后:["img1","img2","img3"]

  • 目的:方便前端遍历显示

  1. 异常处理机制
    5.1 防御性编程
    if($parent['pictures']){...}

  • 先检测再操作:避免null调用explode()
    5.2 数据修剪
    substr($content,0,-2)

  • 作用:移除末尾多余的"//"

  • 原理:取从0开始到倒数第3个字符

  1. 输出生态系统
    最终生成结构:
    $post_info'sub' = [
    'parent' => 原始帖子数据,
    'content' => "@用户1:内容1//@用户2:内容2"
    ]

需要特别注意的三个技术要点:

  1. 数据库查询是性能瓶颈(建议添加索引)

  2. 循环次数没有硬性限制(可能需加层级限制)

  3. 图片处理仅在最外层执行(转发链末端)


//拼接@内容这个地方会如何显示            

$content = '@'.$parent['username'].':'.$parent['content'].'//'.$content;


这段PHP代码是构建微博/论坛转发链的核心拼接逻辑,其显示效果会按照以下方式呈现:

  1. 基础结构解析:
    @用户名:原文内容//先前拼接内容

  2. 实际显示示例(假设有三级转发):

@王五:今天天气真好//@李四:确实不错//@张三:我同意这个观点
  1. 动态构建过程演示:

  • 初始:$content = ""

  • 第一层转发:$content = "@张三:我同意这个观点//"

  • 第二层转发:$content = "@李四:确实不错//@张三:我同意这个观点//"

  • 第三层转发:$content = "@王五:今天天气真好//@李四:确实不错//@张三:我同意这个观点//"

  1. 关键特征说明:

  • @符号:标识用户引用

  • 冒号::分隔用户名和内容

  • 双斜杠//:区分不同层级的转发内容

  • 逆向排列:最新转发在最前面

  1. 最终显示效果:
    会在消息界面呈现为带@标记的级联内容,典型样式为:

@王五:今天天气真好
  ↓ 转发自
@李四:确实不错
  ↓ 转发自 
@张三:我同意这个观点

需要特别注意:

  1. 如果$parent['content']本身包含换行符,需要额外处理显示格式

  2. 移动端通常会折叠显示,点击展开完整转发链

  3. 用户名可能会有最大长度限制(前端需做截断处理)


$parent['content']这个内容不是父级的?

是自己在转发时说的话?


在PHP转发逻辑中,$parent['content'] ‌确实是父级帖子的原始内容‌,

不是当前用户转发时说的话。这里存在三个关键概念需要区分:

  1. 数据流向关系‌:

    • $parent['content']:被转发帖子的原文(父级内容)

    • $post_info['content']:当前用户转发时新增的内容(通常为空或附加评论)

    • 拼接后的$content:最终显示的完整转发链

  2. 实际场景示例‌:

    • 用户A发帖:"今天天气真好"(原始内容)

    • 用户B转发时:可能添加"我也觉得" + 转发A的内容

    • 此时:

    $parent['content'] = "今天天气真好" // 用户A的原文
    $post_info['content'] = "我也觉得" // 用户B的附加评论
  3. 内容拼接逻辑‌:

// 转发链构建公式:
最终显示 = @父级作者:父级内容 // @更父级作者:更父级内容 // ...
  1. 当前用户自己说的话通常存储在$post_info['content']中,会显示在最外层(不包含@标记的部分)

需要特别注意:

  • 转发功能设计上,$parent始终指向被转发的原始内容

  • 用户新增评论通常需要单独字段存储(如$post_info['comment']

  • 部分系统会将用户评论和转发内容合并显示

如果是想实现「转发时添加评论」的功能,通常需要修改代码为:

$final_content = $post_info['content'] . "\n" . $content; 
// 用户新评论 + 转发链


这里不显示转发时用户发表的内容?

那这个内容跑哪里去了呢?

哪里让它显示的?代码在哪里?

不在这里吗


























在PHP转发逻辑中,用户转发时新增的评论内容通常存储在$post_info['content']中,

而非当前解析的转发处理代码段内

以下是完整的显示机制解析:

一、内容存储位置

  1. 父级内容
    $parent['content']:被转发帖子的原始内容(必须通过递归查询获取)

$parent['username']:原始作者名

  1. 用户新增内容
    $post_info['content']:转发时用户输入的评论(通常由表单提交直接获得)

二、显示逻辑架构

[用户新增内容]  // 来自$post_info['content']
↓
[转发链内容]   // 由@父级作者:父级内容//...拼接而成

三、关键代码定位

  1. 内容接收端
    通常在表单处理文件中(如post_submit.php):

$post_info['content'] = $_POST['comment']; // 接收用户输入的转发评论
  1. 内容展示端
    在模板文件(如template.html)中会有类似代码:

<div class="post-content">
  <?= $post['content'] ?> <!-- 用户新增内容 -->
  <div class="repost-chain"><?= $post['sub']['content'] ?></div> <!-- 转发链 -->
</div>

四、典型数据流示例

// 用户转发时提交的数据
$post_info = [
    'pid' => 123,       // 转发目标ID
    'content' => "我也认同这个观点",  // 用户新增评论
    'post_type' => 2    // 转发类型
];
// 处理后最终数据结构
$post_info = [
    'content' => "我也认同这个观点",  // 用户说的话
    'sub' => [
        'content' => "@李四:原文内容//@张三:更早内容",
        'parent' => [...]  // 原始帖子数据
    ]
];

五、常见问题排查

  1. 内容缺失情况

    • 检查表单是否包含comment字段

    • 验证数据库是否存储了content字段

    • 确认模板文件是否正确输出$post['content']

  2. 显示顺序异常
    部分系统会采用倒序显示:

@张三:最早内容
↓ 转发
@李四:中间内容
↓ 转发
我的评论(最新)

建议检查项目的模板引擎文件(如.tpl.blade.php)以及对应的CSS样式文件,这些通常控制最终显示效果5。需要具体查看哪部分代码可以告知项目使用的模板技术。


标签: