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

PHP数据库文章列表:无OOP、无模板引擎的逻辑与HTML分离咨询

原生过程式PHP下的逻辑/视图分离实现

完全可以在不拆出独立单卡片模板文件、不用OOP、不引入第三方模板引擎的前提下,实现业务逻辑和HTML的完全分离。核心方法就是把所有带控制流的代码(数据库查询、结果集遍历、数据清洗)全部从HTML结构里抽出来,集中放在页面最顶部的纯PHP区块,单卡片的HTML片段就留在当前页面文件里,靠PHP内置的输出缓冲能力完成渲染拼接。

核心思路

你现在的写法最大的问题,是循环控制、数据库操作的代码直接嵌在HTML标签中间,改样式的时候容易误碰PHP标签,改逻辑的时候得在一堆HTML里找循环分支。要做到真正分离,只要满足两个要求:

  • 页面主体HTML区域,不出现任何循环判断、数据库调用的执行逻辑,只留纯HTML结构和直接的变量输出语句
  • 单卡片的HTML片段不需要拆成单独的文件,保留在当前页面内,通过输出缓冲捕获成可复用的渲染单元

可直接套用的代码结构

整个页面从上到下分成三个物理隔开的区块,不存在PHP逻辑和HTML的嵌套交叉:

  1. 最顶部:纯PHP逻辑区,一行HTML标签都不写
  2. 逻辑区内定义过程式的卡片渲染函数,卡片HTML就写在函数体里,不用拆外部文件
  3. 页面输出区:纯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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 15:06:03