EMLOG PHP转C#接口开发避坑指南:从SQL预处理到正则清洗,底层逻辑拆解

最近在零点博客折腾 EMLOG 的二次开发,想把现有的 PHP 后台通过接口暴露出来,用 C# 做个轻量级的监控端。踩了一堆坑后,终于把这套逻辑跑通。今天不整虚的,直接把这次从 接口开发 到 SQL注入防护,再到 正则表达式清洗 的底层逻辑拆解给大家,全是实战干货。

一、 为什么选择 C# 做爬虫/接口对接?

EMLOG 是个轻量级 CMS,基于 PHP。直接死磕 PHP 去写复杂的图表展示太慢了。我选 C# 的核心诉求是:高性能、强类型 JSON 解析、方便的正则处理能力。

二、 接口设计的底层逻辑:不是随便查数据库

刚开始我直接在 PHP 里写了一句 `SELECT * FROM emlog_blog WHERE gid IN (...)`,把结果转成 JSON 丢给 C#。这其实是大忌。稍微懂点 SQL注入防护 的人都知道,这种拼接字符串的方式极其危险。

1. PHP 端的安全逻辑(底层逻辑拆解)

我们需要在 PHP 后端做一层预处理。这里的核心 底层逻辑 是:数据库驱动不接收带变量的 SQL,只接收 SQL 模板。

public function getArticles($ids) {
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $sql = "SELECT title, content, gid FROM emlog_blog WHERE gid IN ($placeholders)";
    // 关键:这里必须预处理,防止别人在 id 后面加 '; DROP TABLE emlog_blog;'
    $stmt = $this->db->prepare($sql);
    $stmt->bind_param(str_repeat('i', count($ids)), ...$ids);
    $stmt->execute();
    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

2. C# 端的请求与 JSON 解析

C# 端接收 JSON 后,直接映射到对象,效率极高。如果是爬虫模式,C# 的 HttpClient 也是标配。

var client = new HttpClient();
var response = await client.GetStringAsync("http://blog.example.com/api.php?ids=1,2,3");
var articles = JsonConvert.DeserializeObject<List<Article>>(response);

三、 遇到的坑:数据的脏乱差与正则清洗

接口跑通了,但我发现 EMLOG 的文章标题里总混着一些奇怪的 HTML 标签和多余空格。这就是 C# 开发中 数据清洗 环节的必修课。

实操:用正则表达式进行数据清洗

直接用显示给用户看的内容是不行的,我们在后端生成接口时,应该处理一下。

public string CleanHtml(string input)
{
    if (string.IsNullOrEmpty(input)) return string.Empty;
    // 去除 HTML 标签,只保留文本
    string noHtml = Regex.Replace(input, @"<[^>]+>", "");
    // 去除多余空格和换行
    noHtml = Regex.Replace(noHtml, @"\s+", " ");
    return noHtml.Trim();
}

// 应用
foreach (var item in articles)
{
    item.RawTitle = item.RawTitle; // 保留原始数据
    item.CleanTitle = CleanHtml(item.RawTitle);
}

这一步的 底层逻辑 是:JSON 是通用的数据载体,但人类(或前端)只喜欢干净的文本。

四、 爬虫开发中的 MySQL 操作优化

在写一些 在线工具 或者定时任务爬虫时,C# 操作 MySQL 需要注意连接池和事务。为了保证数据一致性,我会加上事务:

using (var transaction = connection.BeginTransaction())
{
    using (var cmd = connection.CreateCommand())
    {
        cmd.Transaction = transaction;
        // 批量插入逻辑...
        transaction.Commit();
    }
}

五、 复盘总结

这次从 PHP 后端 API 到 C# 端接收、解析、清洗的全链路开发,让我对 底层逻辑 有了更深的理解:

  1. 安全第一:永远不要相信输入的 SQL 参数,预处理是铁律。
  2. 数据纯净:接口返回的 JSON 应该是“经过加工”的,而不是“原汤化原水”。
  3. 工具组合:C# 的强类型配合正则,在处理 EMLOG 这种非结构化文本数据时,效率远超 PHP。

这套源码和逻辑我已经整理好了,放在了零点博客的 GitHub 仓库里,大家可以直接拿来复刻一个属于自己的 EMLOG 监控面板。如果有更好的 SQL 优化方案,欢迎在评论区留言指点。