Как использовать поиск по отдельным столбцам в DataTable с обработкой на стороне сервера?

#javascript #php #jquery #mysql #datatable

Вопрос:

Я работаю с проектом, имеющим большой объем данных. Я уже использовал обработку на стороне сервера для быстрой обработки или загрузки данных. Но мой босс хочет добавить поиск в каждую колонку, я пытаюсь использовать мультифильтр, но данные не изменились. Как бы я решил эту проблему?

Это таблица, в которую я загружаю свои данные из базы данных:

 <table class="table table-bordered responsive nowrap" id="example" width="100%">    
    <thead> 
        <tr>
            <th width="3%">No</th>
            <th width="30%">Machine</th>
            <th width="15%">Spec1</th>
            <th width="15%">Spec2</th>
            <th width="6%">Spec3</th>
            <th width="6%">Spec4</th>
            <th width="6%">Spec5</th>
            <th width="6%">Spec6</th>
            <th width="6%">Qty</th>
            <th></th>
        </tr>
    </thead>
    <tfoot>
        <tr>
            <th width="3%">No</th>
            <th width="30%">Machine</th>
            <th width="15%">Spec1</th>
            <th width="15%">Spec2</th>
            <th width="6%">Spec3</th>
            <th width="6%">Spec4</th>
            <th width="6%">Spec5</th>
            <th width="6%">Spec6</th>
            <th width="6%">Qty</th>
            <th></th>
        </tr>
    </tfoot>
</table>
 

Это скрипт, который я использую для загрузки данных из MySQL с помощью PHP и AJAX. Я уже добавил скрипт с несколькими фильтрами после ajax, но он все еще не работает.

 $(document).ready(function(){
  //Reading
    var dataTable=$('#example').DataTable({
        "processing": true,
        "serverSide":true,
        "ajax":{
            url:"pages_exe/machine_dt.php",
            type:"POST"
        },
        initComplete: function () {
            this.api().columns().every( function () {
                var column = this;
                var select = $('<select><option value=""></option></select>')
                    .appendTo( $(column.footer()).empty() )
                    .on( 'change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );
 
                        column
                            .search( val ? '^' val '

Это PHP-файл для загрузки или получения данных из моей базы данных.
machine_dt.php

 <?php
include '../environment.php';
include '../config/database.php';

$request=$_REQUEST;
$col =array(
    0   =>  'machid',
    1   =>  'machine',
    2   =>  'spec1',
    3   =>  'spec2',
    4   =>  'spec3',
    5   =>  'spec4',
    6   =>  'spec5',
    7   =>  'spec6',
    8   =>  'qty'
);  //create column like table in database

$sql =" SELECT * FROM machinelist
        /*WHERE qty != 'disable'*/
        ORDER BY machine ASC;";
$query=mysqli_query($db,$sql);

$totalData=mysqli_num_rows($query);

$totalFilter=$totalData;

//Search
$sql =" SELECT * FROM machinelist
        /*WHERE qty != 'disable'*/
        WHERE 1=1
        ";

if(!empty($request['search']['value'])){
    $sql.=" AND (machine Like '%".$request['search']['value']."%' ";
    $sql.=" OR brand Like '%".$request['search']['value']."%' ";
    $sql.=" OR spec2 Like '%".$request['search']['value']."%' ";
    $sql.=" OR spec3 Like '%".$request['search']['value']."%' ";
    $sql.=" OR spec4 Like '%".$request['search']['value']."%'";
    $sql.=" OR spec5 Like '%".$request['search']['value']."%' ";
    $sql.=" OR spec6 Like '%".$request['search']['value']."%' ";
    $sql.=" OR qty Like '%".$request['search']['value']."%' )";
}
$query=mysqli_query($db,$sql);
$totalData=mysqli_num_rows($query);

//Order
$sql.=" ORDER BY ".$col[$request['order'][0]['column']]."   ".$request['order'][0]['dir']."  LIMIT ".
    $request['start']."  ,".$request['length']."  ";

$query=mysqli_query($db,$sql);

$data=array();
$i=1;
while($row=mysqli_fetch_array($query)){
    $subdata=array();

    $subdata[]= $i  ;
    $subdata[]=$row[1]; 
    $subdata[]=$row[2]; 
    $subdata[]=$row[3]; 
    $subdata[]=$row[4]; 
    $subdata[]=$row[5];  
    $subdata[]=$row[6]; 
    $subdata[]=$row[7];
    $subdata[]=$row[8];
    $subdata[]='<button type="button" class="btn btn-primary btn-sm" id="update" data-id="'.$row[0].'" >Edit</button>
                <button type="button" class="btn btn-danger btn-sm" id="delete" data-id="'.$row[0].'" >Delete</button>';
    $data[]=$subdata;
}

$json_data=array(
    "draw"              =>  intval($request['draw']),
    "recordsTotal"      =>  intval($totalData),
    "recordsFiltered"   =>  intval($totalFilter),
    "data"              =>  $data
);

echo json_encode($json_data);

?>
 


Комментарии:

1. При использовании режима на стороне сервера фильтрация на стороне клиента отключается. Вместо draw() этого вызов (который вам все еще нужен) вызовет отправку данных на сервер. DataTables делает это автоматически за вас. Поэтому вы должны увидеть любые выбранные раскрывающиеся значения в этом запросе-например, в columns[2][search][value] . Полный список полей, входящих в запрос, см. в разделе "Отправленные параметры" .

2. Итак, вопрос в следующем: видите ли вы выбранные вами раскрывающиеся значения в этих полях запроса? Посмотрите на запрос в инструментах вашего браузера (F12).

3. Вы не должны вводить данные пользователя непосредственно в инструкции sql, иначе ваш сайт скоро будет взломан (см. Инъекцию SQL ). Вы можете решить эту проблему, либо используя интерфейс базы данных PDO в PHP, либо используя PHP-код для фильтрации записей, а не добавляя несколько громоздкое предложение AND в конце.

Ответ №1:

 $sql.=" AND (machine Like '%".$request['search']['value']."%' ";
$sql.=" OR brand Like '%".$request['search']['value']."%' ";
$sql.=" OR spec2 Like '%".$request['search']['value']."%' ";
$sql.=" OR spec3 Like '%".$request['search']['value']."%' ";
$sql.=" OR spec4 Like '%".$request['search']['value']."%'";
$sql.=" OR spec5 Like '%".$request['search']['value']."%' ";
$sql.=" OR spec6 Like '%".$request['search']['value']."%' ";
$sql.=" OR qty Like '%".$request['search']['value']."%' )";
 

подходит для игрушечных проектов. Но он не будет масштабироваться намного больше тысячи строк.

Если вашему боссу нужна как гибкость, так и производительность в масштабе, вам нужно изменить вопрос на что-то более похожее

Как я могу эффективно выполнять текстовый поиск по нескольким столбцам?

На этот вопрос вам будет представлено обсуждение ПОЛНОТЕКСТОВОЙ индексации и объединения столбцов в один столбец.

Комментарии:

1. Вижу ли я здесь SQL-инъекцию? Пользовательский ввод прямо в SQL? По крайней мере, пожалуйста, добавьте предупреждение о том, что это должно быть сделано как-то раньше.

: '', true, false )
.draw();
} );

column.data().unique().sort().each( function ( d, j ) {
select.append( '<option value="' d '">' d '</option>' );
} );
} );
}
});
});
Это PHP-файл для загрузки или получения данных из моей базы данных.
machine_dt.php


Комментарии:

1. При использовании режима на стороне сервера фильтрация на стороне клиента отключается. Вместо draw() этого вызов (который вам все еще нужен) вызовет отправку данных на сервер. DataTables делает это автоматически за вас. Поэтому вы должны увидеть любые выбранные раскрывающиеся значения в этом запросе-например, в columns[2][search][value] . Полный список полей, входящих в запрос, см. в разделе «Отправленные параметры» .

2. Итак, вопрос в следующем: видите ли вы выбранные вами раскрывающиеся значения в этих полях запроса? Посмотрите на запрос в инструментах вашего браузера (F12).

3. Вы не должны вводить данные пользователя непосредственно в инструкции sql, иначе ваш сайт скоро будет взломан (см. Инъекцию SQL ). Вы можете решить эту проблему, либо используя интерфейс базы данных PDO в PHP, либо используя PHP-код для фильтрации записей, а не добавляя несколько громоздкое предложение AND в конце.

Ответ №1:


подходит для игрушечных проектов. Но он не будет масштабироваться намного больше тысячи строк.

Если вашему боссу нужна как гибкость, так и производительность в масштабе, вам нужно изменить вопрос на что-то более похожее

Как я могу эффективно выполнять текстовый поиск по нескольким столбцам?

На этот вопрос вам будет представлено обсуждение ПОЛНОТЕКСТОВОЙ индексации и объединения столбцов в один столбец.

Комментарии:

1. Вижу ли я здесь SQL-инъекцию? Пользовательский ввод прямо в SQL? По крайней мере, пожалуйста, добавьте предупреждение о том, что это должно быть сделано как-то раньше.