Php CodeIgniter/jQuery数据库过滤系统
我正在尝试使用ajax和CodeIgniter&jQuery创建一个动态过滤系统 我有一个从数据库中提取的项目列表,以及一个用于筛选这些项目的复选框列表。 我想能够选择多个复选框,允许各种过滤器 当点击过滤器复选框时,我序列化了表单,但我不确定如何将其传递给codeigniter以及如何处理它。 到目前为止,我已经尝试过这样做,在查询字符串中传递序列化数据Php CodeIgniter/jQuery数据库过滤系统,php,jquery,serialization,codeigniter,filtering,Php,Jquery,Serialization,Codeigniter,Filtering,我正在尝试使用ajax和CodeIgniter&jQuery创建一个动态过滤系统 我有一个从数据库中提取的项目列表,以及一个用于筛选这些项目的复选框列表。 我想能够选择多个复选框,允许各种过滤器 当点击过滤器复选框时,我序列化了表单,但我不确定如何将其传递给codeigniter以及如何处理它。 到目前为止,我已经尝试过这样做,在查询字符串中传递序列化数据 $('#filter input').bind('change', function(){ var f = $('#filter')
$('#filter input').bind('change', function(){
var f = $('#filter').serialize();
$('#list').load('http://localhost/testing/filter?'+f);
});
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>";
}
}
我的序列化表单返回与筛选器复选框对应的以下内容
cat_0=1&cat_1=1
在CodeIgniter中,我可以轻松创建这个sql查询,查询数据库并返回与过滤器匹配的项
SELECT * FROM `items` WHERE `category` ='0' OR `category` ='1'
我想我的主要问题是从序列化表单中获取类别信息到CodeIgniter中。还是有其他更有效的过滤方法。
任何帮助都将不胜感激。谢谢
编辑
我的问题不是接收查询字符串,而是如何在CI中处理它。最后我做了这个。这是相当混乱,所以如果有人可以看到改进,请让我知道。谢谢
我刚刚使用收到的查询字符串中的类别构建了一个sql查询
$('#filter input').bind('change', function(){
var f = $('#filter').serialize();
$('#list').load('http://localhost/testing/filter?'+f);
});
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>";
}
}
这是我需要在数据库中创建和使用的SQL语句
$config['enable_query_strings'] = FALSE;
如果您的url是正确的,那么您正在尝试将QueryString与codeigniter一起使用,这是一个基于uri段的url 在第151行的system/application/config/config.php中,应该有这一行
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.";
}
}
将此值更改为TRUE,然后查看是否允许您使用$this->input->get'cat_0';和$this->input->get'cat_1';从url获取数据
此外,为了确保您的url是正确的,请尝试在浏览器中直接点击它,传递一些任意数据,并确保您没有收到404或500消息,而是按照预期将数据返回到浏览器
注
虽然此方法应该可以工作,但通过.load发送数据的正确方法是将其作为第二个参数传递,因此对于您的示例$'list'.load'path/to/file',f
编辑
这就是我将如何完成您所尝试的,利用Codeigniter的ActiveRecord类可以让您逐步地构建查询变得不那么麻烦
$('#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.
}
});
});
更好的方法是使用ajax将数据传递给控制器
由于我在该url中没有看到index.php,我假设您正在运行.htaccess并将其从url中删除?不仅是.load是一个ajax快捷方式,还破坏了常规$.ajax函数的使用。我使用load是为了快速测试。这仍然是错误的,为什么要在数据参数中添加'value='呢?为什么要将它设置为需要“json”?是的,我为查询字符串设置了codeIgniter,所以在CI中,我应该循环使用$\u GET,在返回列表之前添加相关项?实际上,我以前是用switch语句来做这件事的,但我觉得这有点冗长。我只是使用.load进行测试,一旦它运行起来,我将切换到ajax。更新的答案,附带说明,您没有理由从.load切换到$.ajax。load的代码少得多,非常适合您的使用。load只是一个快捷的ajax功能。谢谢您的帮助jon。我担心直接使用$\u GET变量,不知道为什么,但我认为这是错误的。我想我会坚持使用.load,我没有意识到它有一个完整的回调,我可以用来设置加载动画。再次感谢您的帮助。没问题,伙计,是的,使用$\u-GET作为测试语句通常没有问题,我不会直接通过$\u-GET或$\u-POST获取信息,并尝试保持在CI输入类中。