大家好,我是零点博客的主理人。最近为了给我们的站点开发一个基于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 源码二次开发中有疑问,欢迎在评论区留言交流!



评论一下吧
取消回复