Datatables обработка на стороне сервера sql server с пользовательскими данными

У меня есть большая база данных из ~ 120 тыс. Записей, и я написал приложение для взаимодействия с его данными, с частью для их редактирования, которую я должен улучшить, потому что я получаю данные из диалогов, и должно быть лучше, если я буду использовать встроенные. Это приложение создано с помощью jQuery - jQueryUI - Datatables.

В качестве обходного пути, чтобы избежать больших запросов в основном выборе, я уменьшил вероятность предоставления большого количества данных. Сервер представляет собой Windows 2008 R2, на котором работает экземпляр IIS с модулем PHP, этот модуль в начале был настроен для работы с 256 МБ памяти, я переключился на 512 МБ из-за узкого места в памяти, но у меня все еще было узкое место на объем памяти. Измеряя его, я заметил, что в некоторых запросах ему требуется больше памяти, около ~ 600 МБ, по этой причине я оставил memory_limit -1, поэтому без ограничений. На самом деле промежуточное ПО PHP возвращает набор результатов как json, он выполняет преобразование, для которого требуется двойной объем памяти. Прошу прощения, если я останусь в объяснениях по этому поводу, я просто хочу понять суть моей работы. Кстати, когда я писал приложение, у меня не было времени изучить решение, но теперь у меня есть
. Теперь пришло время, когда sql server 2008 R2 не реализует ограничения при выборе запроса. Прежде всего я сделал запрос с ограничениями на сервере sql:
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 передаст это в массив сообщений, но мне нужно указать, потому что я должен передать свои параметры. Это мой вызов 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
        }

    });

};

Определение My 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 больше не подлежит обновлению до разбивки на страницы на стороне сервера, я добавлю «bProcessing»: true и «serverSide»: true.

Заранее большое спасибо,
С уважением.

В чем тут вопрос?

Sean Lange 14.03.2018 15:12

Простите, чтобы описать ситуацию, я не уточнил вопрос.

rivaldid 14.03.2018 15:20

Мне было интересно, как передать необходимые параметры в DataTables для разбивки на страницы на стороне сервера. В запросе есть другие параметры, которые необходимы для запроса, но я не знаю, как просмотреть и передать вызов ajax.

rivaldid 14.03.2018 15:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
1 563
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

если вы хотите использовать серверную часть, сделайте следующее:

//...
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 - это объект, содержащий все необходимые параметры для пейджинга, в частности start и length. Вы можете развернуть d, как показано.

то вам нужно отформатировать возвращенный json, как указано в ссылке.

Спасибо, мужик, это работает, и это было то, что мне нужно. Теперь мне просто нужно закончить ресурс промежуточного программного обеспечения.

rivaldid 20.03.2018 15:25

Другие вопросы по теме