【问题标题】:Datatables joining tables search and order stuck with codeigniter数据表加入表搜索和排序卡在codeigniter中
【发布时间】:2016-03-26 22:29:36
【问题描述】:

我按照this 的步骤学习使用codeigniter 的数据表。但是我在加入两个表时遇到了一些错误 在数据表中使用搜索。这是我的错误,

然后正如我在documentation AJAX 错误中看到的,解决方法是在网络请求浏览器中搜索查找错误服务器。我收到 500 内部服务器错误。这是我复制了故障的响应正文。

错误号:42000/1064

您的 SQL 语法有错误;检查与>您的 MySQL 服务器版本相对应的手册,以获取在 'as >nm_propinsi LIKE '%c%' ESCAPE '!' 附近使用的正确语法) ORDER BY id_kota DESC LIMIT 10' 在第 7 行

SELECT * FROM `kota` as `k` LEFT JOIN `propinsi` as `p` ON `p`.`id_propinsi` = `k`.`id_propinsi` WHERE ( `k`.`id_kota` LIKE '%c%' ESCAPE '!' OR `k`.`nm_kota` LIKE '%c%' ESCAPE '!' OR `p`.`nm_propinsi` as `nm_propinsi` LIKE '%c%' ESCAPE '!' ) ORDER BY `id_kota` DESC LIMIT 10

错误在于我的查询是通过LIKE 获取数据表的列表数据。

这是我为数据表创建查询搜索的模型,

var $column = array('k.id_kota','k.nm_kota', 'p.nm_propinsi as nm_propinsi'); //set column field database for order and search
var $order = array('id_kota' => 'desc'); // default order 
function get_datatables(){
  $this->_get_datatables_query();
  if($_POST['length'] != -1)
  $this->db->limit($_POST['length'], $_POST['start']);
  $query = $this->db->get();
  return $query->result();
}
private function _get_datatables_query(){
  
  $this->db->from('kota as k');
  $this->db->join('propinsi as p', 'p.id_propinsi = k.id_propinsi');

  $i = 0;

  foreach ($this->column as $item) // loop column 
  {
     if($_POST['search']['value']) // if datatable send POST for search
     {
        
        if($i===0) // first loop
        {
           $this->db->group_start(); // open bracket. query Where with OR clause better with bracket. because maybe can combine with other WHERE with AND. 
           $this->db->like($item, $_POST['search']['value']);
        }
        else
        {
           $this->db->or_like($item, $_POST['search']['value']);
        }

        if(count($this->column) - 1 == $i) //last loop
           $this->db->group_end(); //close bracket
     }
     $column[$i] = $item; // set column array variable to order processing
     $i++;
  }
  
  if(isset($_POST['order'])) // here order processing
  {
     $this->db->order_by($column[$_POST['order']['0']['column']], $_POST['order']['0']['dir']);
  } 
  else if(isset($this->order))
  {
     $order = $this->order;
     $this->db->order_by(key($order), $order[key($order)]);
  }
}

我的函数控制器获取 AJAX JSON,

public function list_kota(){
    $this->load->model("kota_model");
    $list = $this->kota_model->get_datatables();
    $data = array();
    $no = $_POST['start'];
    foreach ($list as $ko) {
        $no++;
        $row = array();
        $row[] = $ko->id_kota;
        $row[] = $ko->nm_kota;
        $row[] = $ko->nm_propinsi;

        //add html for action
        $row[] = '<a class="btn btn-sm btn-primary" href="javascript:void()" title="Edit" onclick="edit_kota('."'".$ko->id_kota."'".')"><i class="glyphicon glyphicon-pencil"></i> Edit</a>
              <a class="btn btn-sm btn-danger" href="javascript:void()" title="Hapus" onclick="delete_kota('."'".$ko->id_kota."'".')"><i class="glyphicon glyphicon-trash"></i> Delete</a>';
    
        $data[] = $row;
    }

    $output = array(
        "draw" => $_POST['draw'],
        "recordsTotal" => $this->kota_model->count_all(),
        "recordsFiltered" => $this->kota_model->count_filtered(),
        "data" => $data,
        );
    //output to json format
    echo json_encode($output);
}

我现在该怎么办?有什么建议吗?

【问题讨论】:

    标签: php mysql ajax codeigniter datatables


    【解决方案1】:

    根据你的模型,你可以像下面这样修改它

    private function _get_datatables_query($term=''){ //term is value of $_REQUEST['search']['value']
        $column = array('k.id_kota','k.nm_kota', 'p.nm_propinsi');
        $this->db->select('k.id_kota, k.nm_kota, p.nm_propinsi');
        $this->db->from('kota as k');
        $this->db->join('propinsi as p', 'p.id_propinsi = k.id_propinsi','left');
        $this->db->like('k.id_kota', $term);
        $this->db->or_like('k.nm_kota', $term);
        $this->db->or_like('p.nm_propinsi', $term);
        if(isset($_REQUEST['order'])) // here order processing
        {
           $this->db->order_by($column[$_REQUEST['order']['0']['column']], $_REQUEST['order']['0']['dir']);
        } 
        else if(isset($this->order))
        {
           $order = $this->order;
           $this->db->order_by(key($order), $order[key($order)]);
        }
    }
    
    function get_datatables(){
      $term = $_REQUEST['search']['value'];   
      $this->_get_datatables_query($term);
      if($_REQUEST['length'] != -1)
      $this->db->limit($_REQUEST['length'], $_REQUEST['start']);
      $query = $this->db->get();
      return $query->result(); 
    }
    
    function count_filtered(){
      $term = $_REQUEST['search']['value']; 
      $this->_get_datatables_query($term);
      $query = $this->db->get();
      return $query->num_rows();  
    }
    
    public function count_all(){
      $this->db->from($this->table);
      return $this->db->count_all_results();  
    }
    

    【讨论】:

      【解决方案2】:

      为什么不图书馆 ignited-datatables ? 并结合 jquery.dataTables.columnFilter.js ..

      示例视图 diplay view

      控制器:

          function fnDataJson()
      {
          $this->load->library('datatables');
          $this->datatables->select('id,first_name,last_name,position,email,office,salary');
          $this->datatables->from('datatables_demo');
      
          echo $this->datatables->generate();
      }
      

      查看

      // HTML
      <table id="tableEmployee" class="table datares">
          <thead>
              <tr>
                  <th>id</th>
                  <th>first_name</th>
                  <th>last_name</th>
                  <th>position</th>
                  <th>email</th>
                  <th>office</th>
                  <th>salary</th>
              </tr>
          </thead>
          <tbody>
          </tbody>
          <tfoot>
              <tr>
                  <th>id</th>
                  <th>first_name</th>
                  <th>last_name</th>
                  <th>position</th>
                  <th>email</th>
                  <th>office</th>
                  <th>salary</th>
              </tr>
          </tfoot>
      </table>
      
      
      // Javascript
          oTable = $('#tableEmployee').dataTable({
              "processing": true,
              "serverSide": true,
              "sAjaxSource": "<?php echo site_url();?>/md_employee/fnDataJson",
              "aoColumns": [ 
                  {'sName' : 'id'},{'sName' : 'first_name'},{'sName' : 'last_name'},{'sName' : 'position'},{'sName' : 'email'},{'sName' : 'office'},{'sName' : 'salary'} 
              ],
              "fnServerData": function( sSource, aoData, fnCallback ) {
                  $.ajax( {
                      'dataType': 'json',
                      'type'    : 'POST',
                      'url'     : sSource,
                      'data'    : aoData,
                      'success' : fnCallback
                  } );
              },      
              "fnRowCallback": function (nRow, aData, iDisplayIndex, DisplayIndexFull) {
                var page      = this.fnPagingInfo().iPage;
                var lengt     = this.fnPagingInfo().iLength;
                var index     = (page * lengt + (iDisplayIndex +1));
                //alert( 'Now on page '+index );
                $('td:eq(0)', nRow).html(index+'<input type="hidden" id="idEmployee'+iDisplayIndex+'" value="'+aData[0]+'" >');
              }
          }).columnFilter({ aoColumns: [
                  null,
                  { type: "text", bRegex:true },
                  { type: "text", bRegex:true },
                  { type: "text", bRegex:true },
                  { type: "text", bRegex:true },
                  { type: "text", bRegex:true },
                  { type: "text", bRegex:true }
              ]});
      

      【讨论】:

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