大家好,我是零点博客的主理人。最近为了给我们的站点开发一个基于Web的后台管理小工具,我花了不少时间在 C# 后端和 MySQL数据库 的交互上。过程中踩了不少坑,今天特意把这些踩过的坑和实战经验整理出来,希望能帮到同样在做后端开发的朋友。这次的内容核心就是怎么用 C# 稳定地操作数据库,特别是面对 EMLOG 这类老牌 PHP 系统,我们要怎么用 C# 去对接它的数据,顺便聊聊那些看似不起眼但致命的 SQL 注入问题。

一、 为什么用 C# 去碰 EMLOG?

零点博客最初是用 PHP (EMLOG) 搭建的,大家都知道 PHP 虽好,但处理高频请求或者做复杂的爬虫聚合时,C# (.NET) 的性能优势就很明显了。我想开发一个后台接口,能实时把 EMLOG 的最新文章同步到我们的系统里。这就涉及到一个核心环节:后端如何读取 MySQL 数据库。

二、 C# 连接 MySQL 数据库的底层逻辑

很多新手直接写 `string sql = "select * from emlog_blog where title like '%" + keyword + "%'";`,这是大忌!

实操案例:建立安全的数据库连接

在零点博客的源码实战中,我封装了一个简单的 DbHelper 类。请看下面这段代码,它是连接 MySQL 的基础:

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;

public class DbHelper
{
    // 数据库连接字符串,生产环境记得换成自己的服务器IP和账号密码
    private static string connStr = "Server=localhost;Database=emlog;Uid=root;Pwd=root;charset=utf8mb4;";

    /// <summary>
    /// 执行查询并返回 DataTable
    /// </summary>
    public static DataTable ExecuteQuery(string sql, List<MySqlParameter> parameters = null)
    {
        using (MySqlConnection conn = new MySqlConnection(connStr))
        {
            using (MySqlCommand cmd = new MySqlCommand(sql, conn))
            {
                if (parameters != null)
                {
                    cmd.Parameters.AddRange(parameters.ToArray());
                }

                try
                {
                    conn.Open();
                    DataTable dt = new DataTable();
                    using (MySqlDataReader reader = cmd.ExecuteReader())
                    {
                        dt.Load(reader);
                    }
                    return dt;
                }
                catch (Exception ex)
                {
                    // 真人博主建议:日志记录下来,别直接抛异常给前端
                    Console.WriteLine($"数据库错误:{ex.Message}");
                    return null;
                }
            }
        }
    }
}

三、 SQL注入防护与预处理语句的重要性

这是本次开发中最关键的点。之前我写过一个爬虫,因为拼接字符串导致数据库被拖库,痛定思痛,这次我强制要求所有涉及用户输入的地方必须使用 预处理语句。

如果不加防护,黑客只需要在搜索框输入 `' OR 1=1 --` 就能遍历全库。但在上面的代码中,我们使用了 `MySqlParameter`。C# 会自动把用户输入的变量当作“纯文本”处理,而不是“可执行的代码”。这就是核心:保护 MySQL 数据库不被非法篡改。

四、 接口开发与 JSON 数据解析

后端查到数据后,前端要能拿到。这就涉及到将 C# 对象转换为 JSON 字符串。

public JsonResult GetArticles(string keyword)
{
    // 1. 构建参数化查询
    string sql = "SELECT title, lid, date FROM emlog_blog WHERE title LIKE @kw LIMIT 10";
    var parameters = new List<MySqlParameter> { new MySqlParameter("@kw", "%" + keyword + "%") };

    // 2. 调用数据库操作
    DataTable dt = DbHelper.ExecuteQuery(sql, parameters);

    // 3. 实体转换(避免直接返回DataTable,效率低且不标准)
    var list = new List<ArticleModel>();
    foreach (DataRow row in dt.Rows)
    {
        list.Add(new ArticleModel
        {
            Id = row["lid"].ToString(),
            Title = row["title"].ToString(),
            Date = row["date"].ToString()
        });
    }

    // 4. 返回 JSON
    return Json(new { code = 200, data = list }, JsonRequestBehavior.AllowGet);
}

五、 前端展示与正则清洗

拿到了 JSON 数据,在 HTML/CSS/JS 面板里怎么渲染?我这里用了一些正则表达式来清洗标题里的 HTML 标签,防止界面崩坏:

function renderData(data) {
    const list = document.getElementById('article-list');
    list.innerHTML = '';

    data.forEach(item => {
        // 使用正则去除 HTML 标签,只保留文字
        let cleanTitle = item.title.replace(/<[^>]+>/g, '');

        let html = `
            <div class="item">
                <a href="/post/${item.id}.html" target="_blank">${cleanTitle}</a>
                <span class="date">${item.date}</span>
            </div>
        `;
        list.innerHTML += html;
    });
}

六、 总结与避坑指南

这次开发让我深刻体会到,做后端开发,尤其是涉及 MySQL 数据库操作时,千万别贪图一时方便。拼接 SQL 虽然爽,但隐患巨大。

  • 防注入:永远记住使用参数化查询(预处理语句)。
  • 效率:避免在循环里执行 SQL,尽量一条 SQL 搞定数据,或者使用 `DataReader` 进行流式读取。
  • 规范:JSON 数据传输要规范,前端要做好容错处理。

希望这篇来自零点博客的复盘能对大家的开发工作有所帮助。如果大家在 EMLOG 源码二次开发中有疑问,欢迎在评论区留言交流!