Фильтр данных не работает при применении кода нумерации страниц SQL Server 2008 - PullRequest
0 голосов
/ 03 апреля 2019

Мне удалось заставить нумерацию страниц работать (спасибо @ zhorov ), но каким-то образом это противоречит функции поиска / фильтрации.

Попытка поместить каждый запрос в каждый $_post, чтобы увидеть, не будет ли конфликтовать запрос на выборку, и когда я помещу первый запрос на выборку внизу, он отменит запрос на разбиение на страницы. Когда я помещаю запрос разбивки на страницы сверху, он ничего не отображает.

Вот полный код, который у меня есть

`<?php

include('db.php');
include('function.php');
$query = '';
$output = array();
$query .= "SELECT * FROM users ";
if(isset($_POST["search"]["value"]))
{

    $query .= "WHERE emp_id LIKE '%".$_POST["search"]["value"]."%'  ";
    $query .= "OR id LIKE '%".$_POST["search"]["value"]."%'  ";

}
if(isset($_POST["order"]))
{
    $query .= "ORDER BY ".$_POST['order']['0']['column']." ".$_POST['order']['0']['dir']." ";
}
else
{
    $query .= "ORDER BY id DESC ";
}
if ($_POST["length"] != -1)
 {

     $query = "SELECT *
        FROM (
            SELECT 
                *, 
                ROW_NUMBER() OVER (ORDER BY id DESC) AS Rn
            FROM users )";
    $query .=         
        "sub WHERE  status = 'Active' AND Rn BETWEEN ".($_POST["start"])." AND ".($_POST["start"]  + $_POST["length"] - 1 );        
}

 $menu="";
$statement = $connection->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
$data = array();
$filtered_rows = $statement->rowCount();
foreach($result as $row)
{

    $sub_array = array();
    $sub_array[] = $row['id'];
    $sub_array[] = $row['emp_id'];
    $sub_array[] = $row['username'];
    $sub_array[] = $row['password'];
    $sub_array[] = $row['email'];
    $sub_array[] = $row['firstname'];
    $sub_array[] = $row['middlename'];
    $sub_array[] = $row['lastname'];
    $sub_array[] = $row['location'];
    $sub_array[] = $row['contact_no'];
    $sub_array[] = $row['gender'];
    $sub_array[] = $row['access_type'];
    $sub_array[] = $row['status'];
    $sub_array[] = $row['date_reg'];    
        $sub_array[] = '<button type="button" name="update" id="'.$row["id"].'" class="btn btn-warning btn-xs update">Deactivate</button>';
    $data[] = $sub_array;
}
$output = array(
    "draw"              =>  intval($_POST["draw"]),
    "recordsTotal"      =>  $filtered_rows,
    "recordsFiltered"   =>  get_total_all_records(),
    "data"              =>  $data
);
echo json_encode($output);
?>`

Должны работать и Pagination, и Filter / Serch.

1 Ответ

0 голосов
/ 23 апреля 2019

Вероятно, уже слишком поздно для этого ответа, но я думаю, что следующий подход может помочь.Вам просто нужно поместить ваше предложение WHERE в подзапрос.

<?php

...
# WHERE clause
$where = "WHERE (status = 'Active') ";
if (isset($_POST["search"]["value"])) {
    $where .= " AND ((emp_id LIKE '%".$_POST["search"]["value"]."%') OR (id LIKE '%".$_POST["search"]["value"]."%')) ";
}

# Whole statement
if ($_POST["length"] != -1) {
     $query = "SELECT *
        FROM (
            SELECT 
                *, 
                ROW_NUMBER() OVER (ORDER BY id DESC) AS Rn
            FROM users ".$where." ) ";
    $query .=         
        "sub WHERE Rn BETWEEN ".($_POST["start"])." AND ".($_POST["start"]  + $_POST["length"] - 1 );        
}
if (isset($_POST["order"])) {
    $query .= " ORDER BY ".$_POST['order']['0']['column']." ".$_POST['order']['0']['dir']." ";
} else {
    $query .= " ORDER BY id DESC ";
}
...

?>

Примечания:

Этот пример основан на вашем коде.Обратите внимание, что хотя вы используете подготовленные операторы ($connection->prepare($query)), необходимо использовать параметры для предотвращения SQL-инъекций , когда у вас есть пользовательский ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...