thinkphp+datatables+ajax 大量数据服务器端查询
今天一白天全耗在这个问题上了,知乎2小时除外... 现在19:28分,记下来以备后查。
问题描述:从后台数据库查询人员信息,1w多条,使用一个好看的基于bootstrap的模板 Bootstrap-Admin-Template-master ,其中集成了datatable组件,使用默认配置将后台php查询的数据给到前端网页,发现速度比较慢,20s左右,急脾气的人会砸电脑,为了爱护显示器起见,解决它。
思路:1、修改后台php查询代码,实现分页,前端要看那一页就把那页的数据查出来给他,分页的数据不过几十条,应该秒开了吧;
2、研究datatable组件,有否选项支持异步查询。
动手历史:先按照第1个办法来,修改后台thinkphp的indexAction
1 function index3()
2 {
3 $person = D('BlacklistPerson');
4 import('ORG.Util.Page');// 导入分页类
5 // $count = $person->where($map)->count();//总数量
6 $count=$person->count("id");
7 $listRows='7';
8 $p = new Page($count,$listRows);
9 // 实例化分页类 传入总记录数和每页显示的条数
$p->setConfig('theme', '<li><a>%totalRow% %header%</a></li> %upPage% %downPage% %first% %prePage% %linkPage% %nextPage% %end% ');
$page = $p->show();// 分页显示输出
$this->assign('page',$page);// 赋值分页输出
$fields='id,name,dept_com,address,origin,cardNum,filingTime';
$list = $person->field($fields)->limit($p->firstRow,$p->listRows)->select();
$this->assign('rlist', $list);
$this->display();
dump($person->getLastSql());
dump($count);
dump($p->firstRow);
dump($p->listRows);
dump($list);
26 }
前端页面如下:
1 <head>
2 <script src="__PUBLIC__/jquery-2.1.3/jquery-2.1.3.min.js"></script>
3 <script src="__PUBLIC__/Bootstrap-Admin-Template-master/dist/assets/js/jquery.dataTables.min.js"></script>
4 <!-- <script src="../../../Public/jquery-2.1.3/jquery-2.1.3.min.js"></script>
5 <script src="../../../Public/Bootstrap-Admin-Template-master/dist/assets/js/jquery.dataTables.min.js"></script> -->
6 </head>
7
8
9
<table id="example" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>dept_com</th>
<th>cardNum</th>
</tr>
</thead>
<tfoot>
<tr>
<th>id</th>
<th>name</th>
<th>dept_com</th>
<th>cardNum</th>
</tr>
</tfoot>
</table>
<script>
$(document).ready(function() {
$('#example').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "__PUBLIC__/scripts/server_processing.php"
} );
} );
44 </script>
成功了,但是现实效果很丑,完全不和模板里datatable那近乎完美的美工同一个世界;对于本人这样的css小白加懒虫加半个强迫症,实在不能接受;
走第2种方法试试;
datatable这么牛的组件肯定有简单的设置来支持ajax之类的异步技术吧,跑去datatable.net一阵翻腾,还真有:http://datatables.net/examples/data_sources/server_side.html ;
按部就班试试,有两个比较烦人的问题,一是使用此方法需要用json格式,thinkphp后端返回的是数组,encode_json就行了吧,还不行,仔细一看datatable要求的json格式需要多几个参数,原thinkphp查出的数据数组只是其“data”:“....”部分,只传data会报错,http://datatables.net/manual/tech-notes/1;这几个参数貌似也不复杂,总条数,删选条数之类的,直接用官网给的服务端脚本吧,server_processing.php,ssp.class.php,前者指定服务器参数和查询列,后者是实际查询操作类;好,查出来了,给前台的datatable,使用
<script>
$(document).ready(function() {
$('#example').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "__PUBLIC__/scripts/server_processing.php"
} );
} );
9 </script>
居然报错,说是example已经初始化了,不能再初始化,折腾了三四个小时了,大冷天都冒汗了你给我看这个?莫非要让我去翻出模板怎么封装的datatable,修改默认的初始方式?不至于这么不人道,错误扔给度娘,居然官网就有解答,真是良心网站;http://datatables.net/manual/tech-notes/3;按教程用retrieve: true,强制重新初始化;
1 <script>
2 $(document).ready(function() {
3 $('#dataTable2').DataTable( {
4 //明知DataTable已经初始化了,仍强制重新调整初始化选项
5 retrieve: true,
6 "processing": true,
7 "serverSide": true,
8 "ajax": "__PUBLIC__/scripts/server_processing.php",
9 "columnDefs": [ {
"targets": [ 6 ],
"data": null,
"defaultContent": "i am not empty",
"render": function ( data, type, row ) {
return "<a href=\"__URL__/more/id/"+row[0]+"\" class=\"btn btn-info btn-xs btn-grad\">查看</a>";
}
} ]
} );
} );
19 </script>
最后一个问题了,俺得加个明细按钮啊,原来模板中是传list给volist方法便利,拼接个超链出来,现在咋办,datatable自身怎么指定列的动态值,继续翻官网,找到 http://datatables.net/reference/option/columns.data ,不错,有个render方法,可以拿来用;于是就有了上面的第14行。
测试刷刷的秒开,打完收工,结束一天充(ku)实(bi)的生活。
thinkphp+datatables+ajax 大量数据服务器端查询的更多相关文章
- ThinkPHP中ajax提交数据
		
最近在做项目时遇到了一些需要从页面用ajax提交数据到后台的操作,无奈本人技术有限,网上苦寻,研究了一下ajax和thinkPHP的结合,黄天不负苦心人,终于搞定了. 闲话少叙,进入正题:我需要从页面 ...
 - ajax+php数据增加查询获取删除
		
前段代码部分其实前面已经有写出但是做一点修改所以还是贴出来,可能大家看到代码回不理解,看完图我想大家会理解我为什么这么写了,这和前端布局有关系的,先列出内容在选择内容删除或修改 <!DOCTYP ...
 - thinkphp使用ajax
		
thinkphp使用ajax和之前使用ajax的方法一样,不同点在于之前的ajax中的url指向了一个页面,而thinkphp里面的url需要指向一个操作方法. 一.thinkphp使用ajax返回数 ...
 - TP框架---thinkphp使用ajax
		
thinkphp使用ajax和之前使用ajax的方法一样,不同点在于之前的ajax中的url指向了一个页面,而thinkphp里面的url需要指向一个操作方法. 一.thinkphp使用ajax返回数 ...
 - ThinkPHP框架  【   AJAX方法返回   】  例子:简单添加一条数据  和  查询一个表里的数据
		
注:thinkphp使用ajax和之前使用ajax的方法一样,不同点在于之前的ajax中的url指向了一个页面,而thinkphp里面的url需要指向一个操作方法. 在模块控制器Controller文 ...
 - ASP.NET前台table通过Ajax获取绑定后台查询的json数据
		
上一篇<ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据>写了前台提交数据后台保存到数据库,数据处理以后用户肯定要查询.接下来就写一个前台table通过ajax J ...
 - vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询
		
vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询 基于element Transfer http://element-cn.eleme.io/#/zh-CN/comp ...
 - ajax  判断账户密码   调取数据模糊查询   时钟
		
一.判断账户密码 <Login.html> <head> <meta http-equiv="Content-Type" content=" ...
 - DataTables ajax + bootstrap  分页/搜索/排序/常见问题
		
最近学校的网站建设需要,尝试使用了下Jquery dataTables控件,接触过C#的人都知道,C#中也含有一个DataTable,但它和我们今天讨论的东西无关 我使用的是官网最新的DataTabl ...
 
随机推荐
- RDIFramework.NET平台代码生成器V1.0发布(提供下载)
			
RDIFramework.NET平台代码生成器V1.0发布(提供下载) RDIFramework.NET(.NET快速开发整合框架)框架做为信息化系统快速开发.整合的框架,其目的一至是给用户和开发 ...
 - 使用Httpwatch分析响应时间--转
			
时间片段名称 意思 Blocked (阻塞)灰色 阻塞的时间主要包括,预处理时间,(如缓存查找)和网络排队等待的时间,导致阻塞最主要的原因是下载页面中的图片 DNS Lookup(域名解释)紫色 域名 ...
 - 子查询in和表连接效率
			
在数据查询时,尽量减少in子查询而使用表连接的方式进行,效率更高.
 - [转] Linux下查看用户列表
			
原文地址:http://xiaod.in/read.php?77 俺的centos vps上面不知道添加了多少个账户,今天想清理一下,但是以前还未查看过linux用户列表,google了一下,找到方便 ...
 - android实现边框圆角
			
1. 在drawable 下新建 shape.xml 文件 Xml代码 : 1 <?xml version="1.0" encoding="UTF-8" ...
 - 关于安装PHP补装PDO与PDO_MYSQL操作
			
我这里是通过PHP源码包来安装的 1.安装pdo cd到你的PHP源码包下的ext/pdo目录,然后执行如下操作: #/usr/local/php/bin/phpize (/usr/local/p ...
 - thinkphp3.2.3 成功对接支付宝接口
			
一.首先下载支付宝官方接口,下载地址: https://b.alipay.com/order/productDetail.htm?productId=2012111200373124&tabI ...
 - JSON 格式化为易读格式的字符串
			
算法 http://blog.csdn.net/yanghaitaohhh/article/details/39672783 使用算法如下: 对输入字符串,逐个字符的遍历 1.获取当前字符. 2.如果 ...
 - Java多线程——线程的生命周期和状态控制
			
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
 - 10-利用com组件读取office
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...