我正在尝试使用带有CodeIgniter&的ajax创建一个动态过滤系统。 jQuery的。
我有一个从我的数据库中提取的项目列表,以及一个用于过滤这些项目的复选框列表。 我希望能够选择多个允许各种过滤器的复选框。
单击过滤器复选框时,我会对表单进行序列化,但我不确定如何将其传递给codeigniter以及如何处理它。 到目前为止,我已尝试过这一点,将序列化数据传递给查询字符串。
$('#filter input').bind('change', function(){
var f = $('#filter').serialize();
$('#list').load('http://localhost/testing/filter?'+f);
});
我的序列化表单返回以下内容,对应于过滤器复选框。
cat_0=1&cat_1=1
在CodeIgniter中,我可以轻松创建此sql查询,查询数据库并返回与过滤器匹配的项目。
SELECT * FROM `items` WHERE `category` ='0' OR `category` ='1'
我想我的主要问题是从我的序列化表单中获取类别信息到CodeIgniter。或者是否有另一种更有效的过滤方法。 任何帮助将非常感激。感谢
修改
我的问题是没有收到查询字符串,它是如何在CI中处理它。我最终这样做了。它很乱,所以如果有人能看到改进,请告诉我。感谢
我刚刚使用收到的查询字符串中的类别构建了一个SQL查询。
function filter(){
if($this->input->get('cat_0', true)) {
$a[] = " OR `category` = '0'";
}
if($this->input->get('cat_1', true)) {
$a[] = " OR `category` = '1'";
}
if($this->input->get('cat_2', true)) {
$a[] = " OR `category` = '2'";
}
if($this->input->get('cat_3', true)) {
$a[] = " OR `category` = '3'";
}
if($this->input->get('cat_4', true)) {
$a[] = " OR `category` = '4'";
}
if($this->input->get('cat_5', true)) {
$a[] = " OR `category` = '5'";
}
if($this->input->get('cat_6', true)) {
$a[] = " OR `category` = '6'";
}
if(!isset($a)){
echo "no items";
} else {
$sql = 'SELECT * FROM `items` WHERE ';
$a[0] = str_replace(" OR ", "", $a[0]); //remove 'OR' from first
foreach($a as $b){
$sql = $sql.$b;
}
echo "<pre>";
print_r($this->db->query($sql)->result());
echo "</pre>";
}
}
编辑第二部分
我回到这个问题,我现在需要在查询中添加用户名检查。我现在运气好了以下机智。
function filter(){
$this->db->where('username', $this->ion_auth->profile()->username);
foreach($_GET as $key=>$value){
if($value == 1){
$key = explode('_', $key);
$this->db->or_where('cat', $key[1]);
}
}
print_r($this->db->get('items')->result());
}
这是我需要在我的数据库中创建和工作的SQL语句。
SELECT * FROM `items` WHERE `username` = 'tmp_username' AND `cat` = '0' OR `cat` = '6';
答案 0 :(得分:1)
如果您的网址是正确的,那么您正尝试使用codeigniter“querystrings”,这是一个基于uri网段的网址。
在第151行的system/applicaiton/config/config.php
中应该有这一行
$config['enable_query_strings'] = FALSE;
将此值更改为TRUE
,看看是否允许您使用$this->input->get('cat_0');
和$this->input->get('cat_1');
从网址抓取数据。
另外,为确保您的网址正确无误,请尝试直接在浏览器中点击一下,传递一些任意数据,并确保您没有收到404
或500
消息,但数据按预期返回浏览器。
注意强>
虽然此方法可行,但通过.load()
发送数据的正确方法是将其作为第二个参数传递,因此对于您的示例$('#list').load('path/to/file', f);
修改强>
这就是我将如何实现您的目标,利用Codeigniter的ActiveRecord类使得逐渐构建查询变得更加简洁,就像您尝试的那样。
function filter(){
foreach($_GET as $key=>$value) {
if ($value == 1) {
$key = explode('_',$key);
$this->db->or_where('category', $key[1]);
}
}
if(count($_GET) > 0){
$query = $this->db->get('items');
echo "<pre>";
print_r($query->result());
echo "</pre>";
} else {
echo "no items.";
}
}
答案 1 :(得分:-1)
更好的方法是使用ajax将数据传递给控制器。
$('#filter input').bind('change', function(){
var f = $('#filter').serialize();
$.ajax({
type: "POST",
url: "http://localhost/testing/filter",
data: "value="+f,
dataType: "json",
success: function(data){
//code after success.
}
});
});