datatables服务器端处理带有自定义数据的SQL Server

时间:2018-03-14 14:01:13

标签: php jquery sql-server datatables

我有一个大约120k记录的大型数据库,我编写了一个与其数据交互的应用程序,还有一部分用于编辑它们,我必须改进它们,因为我从对话框中获取数据并且它应该更好如果我做内联。这个应用程序是用jQuery - jQueryUI - Datatables制作的。

作为避免主要选择中的大问题的解决方法,我减少了提供大量数据的机会。服务器是一个Windows 2008 R2,在其上运行带有模块PHP的IIS实例,这个模块在开始时被配置为运行256MB内存,由于内存瓶颈,我已经切换到512MB,但我仍然遇到了瓶颈问题。记忆。测量它我在一些查询中注意到它需要更多的内存,大约600MB左右,因此我离开了memory_limit -1,因此无限。 实际上PHP中间件将结果集作为json返回,他进行转换需要双倍的内存 如果我在关于这个问题的解释中,我道歉,我只是为了表达我的工作 顺便说一句,当我编写应用程序时,我没有时间研究解决方案,但现在我已经有了 现在来了,sql server 2008 R2没有实现查询选择的限制 首先,我在sql server中进行了限制查询:
https://pastebin.com/8JZTAerE

DECLARE @RowsPerPage INT = 10, @PageNumber INT = 1
SELECT *
FROM
    (SELECT 
        myview.*,
        ROW_NUMBER() OVER (ORDER BY foo) AS RowNum
    FROM myview WHERE 1=1
     -- AND foo AND bar AND baz
    ) AS BDT
WHERE
    BDT.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
    AND @RowsPerPage*(@PageNumber)

为了使这个查询起作用,我或DataTables必须传递更多的参数,例如RowsPerPage,PageNumber,排序标准和过滤字符串,它们允许你对返回的结果集进行第二次略读。它就像是第二个,因为您可以在进行主查询后的第二个时刻进行指定。还应该研究这个,因为一些例子对表的每个字段进行过滤,但当然DataTable对结果集有两种类型的过滤:全局适用于每个字段,本地适用于单个字段,所以查询应该更复杂,并采取两个过滤部分。但是这个纯粹的SQL问题,PHP和DataTable不应该关心。 这该怎么做?在我发现的每个例子中,没有人在ajax调用中指定数据。我以为DataTables将它赋予post数组,但我需要指定,因为我必须传递我的参数 这是我的ajax电话:

function ajax_search() {

    return $.ajax({

        beforeSend: function(event, ui) {
            $('#contents').html('<h2>' + title + ' <img src="imgs/loader.gif" alt="Loading..."></h2>');
        },

        type: 'POST',
        url: 'json/ricerca_bdt_ssp.php',
        dataType: 'json',
        data: {
            'user': account,
            'pass': password,
            'user_ad': account_ad,
            'pass_ad': password_ad,
            'device': deviceid,
            'host': dbhost,
            'port': dbport,
            'db': dbname,
            'foo': field_foo,
            'bar': field_bar,
            'baz': field_baz,
            ...
            'other_field': bdt_other_fields,
            'other_pattern': bdt_other_pattern
        }

    });

};

我的DataTables定义(以及工具提示和复选框排序上的其他配置):

table = $("#mytable").DataTable({
    buttons: [ one,two,three ],
    aoColumnDefs: [
        { 'sWidth': '150px', 'aTargets': [1,2,7,8,12,13,15,16,18,19,20,21,22,23,24] },
        ....
    ],
    select: { style: 'multi', selector: 'td:first-child' },

    'autoWidth': false,

    iDisplayLength: 100,
    'scrollY': '50vh',
    'scrollX': 'true',
    'scrollCollapse': 'true'
});

我的DataTables定义不再升级到服务器端分页,我将添加&#34; bProcessing&#34;:true和&#34; serverSide&#34;:true。

非常感谢您提前,
问候。

1 个答案:

答案 0 :(得分:0)

如果您想使用服务器端,则应执行以下操作:

//...
serverSide: true,
ajax: {
    url: "json/ricerca_bdt_ssp.php",
    method: "POST",
    data: function (d) {
        d.user = account;
        d.pass = password;
        //...
        d.other_field = bdt_other_fields;
        d.other_pattern = bdt_other_pattern;
    }
//...

d是一个对象,其中包含分页所需的所有parameters,特别是startlength。您可以展开d,如图所示。

然后你必须格式化链接中指定的返回的json。