【问题标题】:Jquery Datatables Individual column searchingJquery Datatables 单个列搜索
【发布时间】:2018-05-28 11:49:19
【问题描述】:

我正在尝试为 Jquery 中的 Datatables 插件应用 Individual column searching (select inputs)。我正在使用服务器端处理,数据已从 SQL Server 正确加载到我的表中,但是当我想选择一个输入以根据该值过滤列时,过滤器无法正常工作,如您所见 here。 当我选择一个国家(例如奥地利)时,数据不会过滤到奥地利。 这是我的索引页

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html" charset=utf-8" />
  <title> Datatables Individual column searching using PHP Ajax Jquery </title>

<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css">

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>


 </head>
 <body>
  <div class="container">
   <h1 align="center">Datatables</h1>    
   <div class="table-responsive">
<table id="example" class="table table-striped table-bordered" style="width:100%">
        <thead>
            <tr>
                <th>Country</th>
                <th>Territory</th>
                <th>Market</th>
                <th>Entname</th>
                <th>MTM</th>
                <th>Qty</th>
            </tr>
        </thead>

        <tfoot>
            <tr>
                <th>Country</th>
                <th>Territory</th>
                <th>Market</th>
                <th>Entname</th>
                <th>MTM</th>
                <th>Qty</th>
            </tr>
        </tfoot>
    </table>
   </div>
  </div>
 </body>
</html>

<script type="text/javascript" language="javascript" >
$(document).ready(function() {

      var dtable = $('#example').DataTable({  
            "processing": true,
            "serverSide": true,
            "deferRender": true,
            "lengthMenu": [ [25, 50, 100, -1], [25, 50, 100, "All"] ],
            "pageLength": -1,
            "lengthChange": true,
            "pagingType": "full_numbers",
            "columns": [
                {"data": "Country"},
                {"data": "Territory"},
                {"data": "Market"},
                {"data": "Entname"},
                {"data": "MTM"},
                {"data": "Qty"}
            ],
            "ajax": {
                url: 'fetch.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+'$' : '', true, false )
                            .draw();
                    } );

                column.data().unique().sort().each( function ( d, j ) {
                    select.append( '<option value="'+d+'">'+d+'</option>' )
                } );
            } );
        }

        });

      $(".dataTables_filter input")
    .unbind() 
    .bind("keyup change", function(e) { 
        if(this.value.length >= 1 && e.keyCode == 13) { dtable.search(this.value).draw(); }
        if(this.value == "") { dtable.search("").draw(); }
        return;
    });

} );
</script>

这是我的 fetch.php

<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


if (!empty($_POST) ) {

$ser="*****";
$db="*****";
$user="*****"; 
$pass="*****";
$dbDB = new PDO("odbc:Driver=ODBC Driver 13 for SQL Server;Server=*****;Database=*****;Port=1456", $user, $pass);
$MyTable="*****";

    function getData($sql){
        global $dbDB ;
        global $MyTable ;
        $result = $dbDB->query($sql);       
        $data= $result->fetchAll(PDO::FETCH_ASSOC);
        return $data; }

        $res = $dbDB->query("SELECT COUNT(*) FROM ".$MyTable);
        $recordsTotal = $res->fetchColumn();

    $draw = $_POST["draw"];
    $orderByColumnIndex  = $_POST['order'][0]['column'];
    $orderBy = $_POST['columns'][$orderByColumnIndex]['data'];
    $orderType = $_POST['order'][0]['dir']; 
    $start  = $_POST["start"];

    if ($_POST['length'] == -1) {$length = $recordsTotal;} 
    else {$length = $_POST['length'];}    


    if(!empty($_POST['search']['value'])){

        for($i=0 ; $i<count($_POST['columns']);$i++){
            $column = $_POST['columns'][$i]['data'];
            $where[]="$column like '%".$_POST['search']['value']."%'";
        }
        $where = "WHERE ".implode(" OR " , $where);


$sql = sprintf("SELECT COUNT(*) FROM %s %s", $MyTable , $where);
$r = $dbDB->query($sql);
$recordsFiltered = $r->fetchColumn();

         $sql = sprintf("SELECT Country,Territory,Market,Entname,MTM,Qty FROM %s %s ORDER BY %s %s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", $MyTable , $where ,$orderBy, $orderType ,$start,$length);
        $data = getData($sql);
    }

    else {

        $sql = sprintf("SELECT Country,Territory,Market,Entname,MTM,Qty FROM %s ORDER BY %s %s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", $MyTable ,$orderBy, $orderType ,$start,$length);
          $data = getData($sql);
        $recordsFiltered = $recordsTotal;
    }

        $response = array(
        "draw" => intval($draw),
        "recordsTotal" => $recordsTotal,
        "recordsFiltered" => $recordsFiltered,
        "data" => $data );

    echo json_encode($response);
} 

else {
    echo "NO POST Query from DataTable";
}

?>

我认为问题出在 javascript 部分而不是 php 文件中,而只是为了概述数据如何填充到表中。

请问有什么问题吗?

【问题讨论】:

  • 控制台是否显示任何错误?
  • @Script47 不,任何错误。这就是问题
  • 自定义搜索值位于$_POST['columns'][$i]['search']['value'] 变量中。您尚未在当前脚本中检查它们。
  • 检查您的开发工具,以便了解您的数据表发送到 PHP 文件的参数。
  • 我在我的项目中做了同样的事情。它是开源的,所以如果你发现有用的东西,你可以在那里查看:github.com/fbaierl/bundeszirkus-server(虽然是 nodejs 而不是 php,但 API 仍然相同)。在工作 atm 所以没有时间进一步分析您的具体问题,但无论如何它可能对您有所帮助。 :)

标签: javascript php jquery datatables


【解决方案1】:

查看下面的例子

   // Setup - add a text input to each footer cell
 $('#item tfoot th').each( function () {
     var title = $(this).text();
     $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
 } );

// DataTable
 var otable = $('#item').DataTable();

 // Apply the search
 otable.columns().every( function () {
 
     var that = this;
     $( 'input', this.footer() ).on( 'keyup change', function () {
         if ( that.search() !== this.value ) {
             that
                 .search( this.value )
                 .draw();
         }
     } );
 } );
 tfoot {
    display: table-header-group;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://www.jqueryscript.net/demo/DataTables-Jquery-Table-Plugin/media/css/jquery.dataTables.css">

<table name="item" id="item" class="display" width="100%" cellspacing="0">
  <thead>
           <tr>
               <th>Name</th>
               <th>Position</th>
               <th>Office</th>
               <th>Age</th>
               <th>Start date</th>
               <th>Salary</th>
           </tr>
       </thead>
       <tfoot>
           <tr>
               <th>Name</th>
               <th>Position</th>
               <th>Office</th>
               <th>Age</th>
               <th>Start date</th>
               <th>Salary</th>
           </tr>
       </tfoot>
       <tbody>
           <tr>
               <td>Tiger Nixon</td>
               <td>System Architect</td>
               <td>Edinburgh</td>
               <td>61</td>
               <td>2011/04/25</td>
               <td>$320,800</td>
           </tr>
           <tr>
               <td>Garrett Winters</td>
               <td>Accountant</td>
               <td>Tokyo</td>
               <td>63</td>
               <td>2011/07/25</td>
               <td>$170,750</td>
           </tr>
           <tr>
               <td>Ashton Cox</td>
               <td>Junior Technical Author</td>
               <td>San Francisco</td>
               <td>66</td>
               <td>2009/01/12</td>
               <td>$86,000</td>
           </tr>
           <tr>
               <td>Cedric Kelly</td>
               <td>Senior Javascript Developer</td>
               <td>Edinburgh</td>
               <td>22</td>
               <td>2012/03/29</td>
               <td>$433,060</td>
           </tr>
           <tr>
               <td>Airi Satou</td>
               <td>Accountant</td>
               <td>Tokyo</td>
               <td>33</td>
               <td>2008/11/28</td>
               <td>$162,700</td>
           </tr>
      </tbody>
          
   </table>

【讨论】:

  • 感谢您的回答。我已经尝试过该解决方案,但它仅在我有一个静态表时才起作用,但是当我从数据库加载数据时,过滤器不起作用
【解决方案2】:

datefilter 搜索如何,即 enddate>startdate 到这个数据表。它会更方便。

【讨论】:

  • 我建议不要在答案中使用修辞问题。他们有可能被误解为根本不是答案。
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2014-10-12
相关资源
最近更新 更多