DataTables列排序关联错误求助:点击列排序对应错误数据库列
解决DataTables服务端排序映射错误的问题
兄弟,这是DataTables服务端处理时非常常见的一个坑——你现在的问题根源是:前端DataTables默认把列索引传给后端,但你后端直接把这个索引当成了数据库列名来用,而你的数据库里根本没有叫0、1的列,自然就报错了。下面给你一步步解决:
第一步:前端修改columns配置,明确映射数据库列名
你需要在DataTables初始化时,给每个列指定data属性为对应的数据库列名,而不是用默认的索引值。这样后端就能拿到正确的列标识,而不是数字索引。
修改后的前端代码示例:
var dataTable = $('#tableau').DataTable({ "processing": true, "serverSide": true, "order": [], "orderFixed": [], "ordering": true, "ajax": { url: "/charbon/clae-listes/actions/appel.php", type: "POST" }, // 新增columns数组,指定每个列对应的数据库列名 "columns": [ { "data": "id", "orderable": true }, // 第一列对应数据库id列 { "data": "你的第二列数据库名", "orderable": true }, // 替换成实际列名 { "data": "你的第三列数据库名", "orderable": false },// 对应targets[2],不可排序 { "data": "你的第四列数据库名", "orderable": false } // 对应targets[3],不可排序 ], // 原来的columnDefs可以保留,或者直接整合到columns里 "columnDefs": [ { "targets": [2, 3], "orderable": false }, ], });
这样前端发送的请求里,columns[0][data]就会变成你指定的列名(比如id),而不是0了。
第二步:后端做索引到数据库列名的映射,同时防SQL注入
后端不能直接用前端传的column索引,而是要创建一个允许排序的数据库列名数组,把索引和列名一一对应起来,同时验证传入的索引是否合法,避免SQL注入风险。
修改后的后端appel.php排序逻辑:
// 定义前端列索引对应的数据库列名数组,顺序要和前端columns数组一致 $allowed_columns = array( 0 => 'id', // 对应前端第一列 1 => '你的第二列数据库名', // 对应前端第二列 // 第2、3列不可排序,不用加进来或者加了也没关系,后面会判断 ); $query = "SELECT ... FROM 你的表名 "; // 你的基础查询语句 if(isset($_POST["order"]) && !empty($_POST["order"])) { $column_index = $_POST['order'][0]['column']; $dir = $_POST['order'][0]['dir']; // 验证索引是否在允许的范围内,防止恶意输入 if(isset($allowed_columns[$column_index]) && in_array(strtolower($dir), array('asc', 'desc'))) { $column_name = $allowed_columns[$column_index]; $query .= 'ORDER BY '.$column_name.' '.$dir.' '; } else { // 非法输入,用默认排序 $query .= 'ORDER BY id DESC '; } } else { $query .= 'ORDER BY id DESC '; }
为什么之前会出错?
- 点击第一列时,前端传的
order[0][column]是0,你后端直接把0当成列名拼进SQL,数据库找不到0列,就报Unknown column '0' in 'order clause'。 - 点击第二列时,前端传的
column是1,后端用1当列名,数据库同样没有这个列,自然排序不对。
额外提醒
- 一定要确保
allowed_columns数组的顺序和前端columns数组的顺序完全一致,否则映射还是会错。 - 加上对排序方向
dir的验证,只允许asc或desc,进一步防止SQL注入。
内容的提问来源于stack exchange,提问作者user9234196
相关产品推荐
相关产品推荐

