如何为Ajax驱动的DataTable启用分页?Express+MySQL分页失效解决
解决DataTable服务器端分页失效问题(Express+MySQL)
问题核心:你开启了serverSide: true,但后端没有处理DataTable自动发送的start(数据起始偏移量)和length(每页条数)参数,导致每次返回全量数据,分页功能失效。
修复步骤:
1. 后端接收分页参数并修改SQL查询
在你的Express后端代码中,添加对分页参数的处理,并在查询语句中加入LIMIT限制返回条数:
修改后的后端代码(关键部分):
// 新增:获取分页参数,处理默认值 var start = parseInt(req.query.start) || 0; var length = parseInt(req.query.length) || 10; // ... 原有排序、搜索逻辑保持不变 ... // 修改查询数据的SQL,加入LIMIT var sql = `SELECT * FROM datatable WHERE 1 ${search} ORDER BY ${column_name} ${column_sort_order} LIMIT ${start}, ${length}`; var resultData = []; con.query(sql, (err, data) => { if (err) throw err; data.forEach((item) => { resultData.push({ tbl_nomor: item.nomor, tbl_kode: item.kode_pengguna, tbl_nama: item.nama_depan + " " + item.nama_belakang, tbl_status: item.status, tbl_aksi: "Aksi", }); }); var output = { draw: req.query.draw, recordsTotal: recordsTotal, recordsFiltered: recordsFiltered, data: resultData, }; res.json(output); });
额外提示:避免SQL注入风险
当前代码用字符串拼接生成SQL,存在SQL注入漏洞,建议改用参数绑定方式:
// 示例:用占位符替换字符串拼接 var sql = `SELECT * FROM datatable WHERE 1 = 1 AND (nomor LIKE ? OR nama_depan LIKE ? OR nama_belakang LIKE ? OR kode_pengguna LIKE ? OR status LIKE ?) ORDER BY ${column_name} ${column_sort_order} LIMIT ?, ?`; // 处理搜索参数的通配符 var searchParams = [`%${search_value}%`, `%${search_value}%`, `%${search_value}%`, `%${search_value}%`, `%${search_value}%`, start, length]; con.query(sql, searchParams, (err, data) => { // ... 后续逻辑不变 ... });
前端确认配置(可选)
前端代码已正确开启serverSide: true,可以显式添加pageLength确保每页条数:
var table = $("#example").DataTable({ processing: true, serverSide: true, ajax: { url: "/penulis/daftar-penulis/data", type: "GET", }, paging: true, pageLength: 10, // 显式指定每页条数 // ... 其余配置不变 ... });
内容的提问来源于stack exchange,提问作者15. Dwi Wahyu Ilahi
相关产品推荐
相关产品推荐

