【问题标题】:Datatables - Filter SQL results in server-side数据表 - 在服务器端过滤 SQL 结果
【发布时间】:2022-01-25 09:12:36
【问题描述】:

我正在尝试在 DataTables 中创建一个过滤器,但我发现只过滤“前端”中的数据(在数据表脚本中)。我在 SQL 表中有 10K 行,所以我认为“前端过滤/搜索”不是我最好的选择。我需要在服务器端为我的 SQL 查询创建一个过滤器,并且只取回过滤后的行(数据)。

此外,搜索选项对我来说不是一个好选择,因为我在表中有 1 或 2(布尔值)之类的值。

我的DataTables使用这种从后端SQL获取数据的方法(方式):

include 'config.php';

## Read value
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value

$searchArray = array();

## Search 
$searchQuery = " ";
if($searchValue != ''){
   $searchQuery = " AND (emp_name LIKE :emp_name or 
        email LIKE :email OR 
        city LIKE :city ) ";
   $searchArray = array( 
        'emp_name'=>"%$searchValue%", 
        'email'=>"%$searchValue%",
        'city'=>"%$searchValue%"
   );
}

## Total number of records without filtering
$stmt = $conn->prepare("SELECT COUNT(*) AS allcount FROM employee ");
$stmt->execute();
$records = $stmt->fetch();
$totalRecords = $records['allcount'];

## Total number of records with filtering
$stmt = $conn->prepare("SELECT COUNT(*) AS allcount FROM employee WHERE 1 ".$searchQuery);
$stmt->execute($searchArray);
$records = $stmt->fetch();
$totalRecordwithFilter = $records['allcount'];

## Fetch records
$stmt = $conn->prepare("SELECT * FROM employee WHERE 1 ".$searchQuery." ORDER BY ".$columnName." ".$columnSortOrder." LIMIT :limit,:offset");

// Bind values
foreach($searchArray as $key=>$search){
   $stmt->bindValue(':'.$key, $search,PDO::PARAM_STR);
}

$stmt->bindValue(':limit', (int)$row, PDO::PARAM_INT);
$stmt->bindValue(':offset', (int)$rowperpage, PDO::PARAM_INT);
$stmt->execute();
$empRecords = $stmt->fetchAll();

$data = array();

foreach($empRecords as $row){
   $data[] = array(
      "emp_name"=>$row['emp_name'],
      "email"=>$row['email'],
      "gender"=>$row['gender'],
      "salary"=>$row['salary'],
      "city"=>$row['city']
   );
}

## Response
$response = array(
   "draw" => intval($draw),
   "iTotalRecords" => $totalRecords,
   "iTotalDisplayRecords" => $totalRecordwithFilter,
   "aaData" => $data
);

echo json_encode($response);

在这段代码中,您可以看到我有搜索选项,但正如我所说,我不能使用它来过滤具有布尔值的列。

我想做的另一个例子:

我有一个名为“已编辑”的列,带有布尔值。 如何获取“已编辑”列值为 0 的行?

我正在使用 MariaDB。

感谢您的帮助!

【问题讨论】:

  • @thhan 嗨,对不起,我刚刚更新了我的问题。我不使用这个确切的代码。我有来自link 的代码所以我使用这种方式从 SQL 中获取数据。
  • 好的,你可以轻松写...WHERE edited = :edited ...edited的值应该是0代表假,1代表真。
  • @thhan 再次感谢您的回答。但我不想一直使用这种“过滤”。我想创建一个过滤器,用户可以在 DataTables 中轻松打开/关闭它。 (在前端)
  • 您想从您的请求中排除一些条目?
  • @thhan 我认为这是我想做的一个很好的例子:link 在此表的列年龄中,我可以过滤任何内容。我想要完全相同的解决方案,但在后端和 SQL 查询中。谢谢!

标签: php sql datatables mariadb


【解决方案1】:

你可以很容易地写...WHEREedited = :edited ...edited的值应该是0代表假,1代表真。

所以在你的例子中:

## Search 
$searchQuery = " ";
if($searchValue != ''){
    $searchQuery = " AND (emp_name LIKE :emp_name or 
        email LIKE :email OR 
        city LIKE :city ) AND
        edited = :edited";
    $searchArray = array( 
        'emp_name'=>"%$searchValue%", 
        'email'=>"%$searchValue%",
        'city'=>"%$searchValue%",
        'edited'=>$edited
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多