数据表加入表搜索和排序卡在codeigniter中
Posted
技术标签:
【中文标题】数据表加入表搜索和排序卡在codeigniter中【英文标题】:Datatables joining tables search and order stuck with codeigniter 【发布时间】:2016-03-26 22:29:36 【问题描述】:我按照this 的步骤学习使用codeigniter 的数据表。但是我在加入两个表时遇到了一些错误 在数据表中使用搜索。这是我的错误,
然后正如我在documentation AJAX 错误中看到的,解决方法是在网络请求浏览器中搜索查找错误服务器。我收到 500 内部服务器错误。这是我复制了故障的响应正文。
错误号:42000/1064
您的 SQL 语法有错误;检查与>您的 mysql 服务器版本相对应的手册,以获取在 'as >
nm_propinsi
LIKE '%c%' ESCAPE '!' 附近使用的正确语法) ORDER BYid_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);
我现在该怎么办?有什么建议吗?
【问题讨论】:
【参考方案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
]);
【讨论】:
以上是关于数据表加入表搜索和排序卡在codeigniter中的主要内容,如果未能解决你的问题,请参考以下文章
在codeigniter查询生成器中使用union,并在虚拟mysql列中进行过滤