PHP数据库文章列表:无OOP、无模板引擎的逻辑与HTML分离咨询
原生过程式PHP下的逻辑/视图分离实现
完全可以在不拆出独立单卡片模板文件、不用OOP、不引入第三方模板引擎的前提下,实现业务逻辑和HTML的完全分离。核心方法就是把所有带控制流的代码(数据库查询、结果集遍历、数据清洗)全部从HTML结构里抽出来,集中放在页面最顶部的纯PHP区块,单卡片的HTML片段就留在当前页面文件里,靠PHP内置的输出缓冲能力完成渲染拼接。
核心思路
你现在的写法最大的问题,是循环控制、数据库操作的代码直接嵌在HTML标签中间,改样式的时候容易误碰PHP标签,改逻辑的时候得在一堆HTML里找循环分支。要做到真正分离,只要满足两个要求:
- 页面主体HTML区域,不出现任何循环判断、数据库调用的执行逻辑,只留纯HTML结构和直接的变量输出语句
- 单卡片的HTML片段不需要拆成单独的文件,保留在当前页面内,通过输出缓冲捕获成可复用的渲染单元
可直接套用的代码结构
整个页面从上到下分成三个物理隔开的区块,不存在PHP逻辑和HTML的嵌套交叉:
- 最顶部:纯PHP逻辑区,一行HTML标签都不写
- 逻辑区内定义过程式的卡片渲染函数,卡片HTML就写在函数体里,不用拆外部文件
- 页面输出区:纯HTML结构,只输出提前渲染拼接好的文章列表
参考代码:
<?php // -------------------------- // 纯PHP逻辑区:所有数据库操作、数据处理全在这里 // -------------------------- $conn = mysql_connect('localhost', '库账号', '库密码'); mysql_select_db('blog_db', $conn); $result = mysql_query("SELECT post_img, post_author, post_title FROM posts ORDER BY id DESC LIMIT 10", $conn); // 把结果集转成普通PHP数组,提前做转义处理,不要把取数逻辑丢到HTML里 $postList = []; while ($row = mysql_fetch_assoc($result)) { $postList[] = [ 'img' => htmlspecialchars($row['post_img']), 'author' => htmlspecialchars($row['post_author']), 'title' => htmlspecialchars($row['post_title']) ]; } // 定义过程式的卡片渲染函数,没有类、没有对象 // 卡片的HTML片段就写在这个函数里,完全在当前页面文件内 function renderPostCard($post) { ?> <!-- 全是静态的卡片HTML结构,没有任何循环、判断逻辑 --> <article class="post-card"> <img class="post-thumb" src="<?= $post['img'] ?>" alt="文章封面"> <div class="post-meta"> <span>作者:<?= $post['author'] ?></span> </div> <h2 class="post-title"> <a href="#"><?= $post['title'] ?></a> </h2> </article> <?php } // 遍历文章数据,靠输出缓冲把每个卡片的渲染结果拼成完整的列表HTML $renderedPostList = ''; foreach ($postList as $post) { ob_start(); renderPostCard($post); $renderedPostList .= ob_get_clean(); } // 准备公共组件需要的配置变量 $pageConfig = [ 'title' => '文章列表', 'activeNav' => 'post-list' ]; // -------------------------- // 纯PHP逻辑区结束 // -------------------------- ?> <!-- 下面是纯HTML输出区,没有任何执行逻辑 --> <?php include 'components/head.php'; ?> <?php include 'components/header.php'; ?> <?php include 'components/banner.php'; ?> <main class="container"> <!-- 直接输出已经拼好的文章列表,没有其他嵌套逻辑 --> <?= $renderedPostList ?> </main> <?php include 'components/footer.php'; ?> <?php include 'components/js_files.php'; ?>
适配性说明
这个写法完全匹配你的练习场景约束:
- 全程过程式编码,没有类定义、对象实例化等OOP操作
- 没有引入任何第三方模板引擎,只用了PHP内置的
ob_start、ob_get_clean、htmlspecialchars等基础函数 - 单文章卡片的HTML完整保留在当前页面文件里,没有拆成独立的模板文件
- 逻辑和HTML完全解耦:调整查询规则、循环逻辑只需要改顶部逻辑区的代码,调整卡片样式只需要改
renderPostCard函数里的HTML,两者没有交叉嵌套,不会出现改样式碰坏逻辑的问题
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

