如何让jqGrid工具栏搜索工作?

在http://trirand.com/blog/jqgrid/jqgrid.html ,在“版本3.7中的新function”>“列搜索”下,有一个解释的方法可供搜索,但它还没有为我工作。 我已经添加:

jQuery("#toolbar").jqGrid('filterToolbar',{stringResult: true,searchOnEnter : false}); 

来自示例的不太重要的代码。 我的服务器看到了稍微不同的JSON请求,但是没有_search=true且没有搜索词。

http://trirand.com/blog/jqgrid/jqgrid.html也提供了服务器端代码的不完整示例。 SQL语句在PHP示例中给出:

 $SQL = "SELECT item_id, item, item_cd FROM items ".$where." ORDER BY $sidx $sord LIMIT $start , $limit"; 

但是,虽然$sidx$sord$start$limit都有代码来定义它们,但$where未在页面上的任何其他位置定义(或引用)。

如何获取列搜索,如页面文档,我的服务器被适当的请求命中?

应该在用于定义网格的同一元素上调用filterToolbar方法。 看看使用它的工作示例 。

我无法帮助你处理问题的PHP部分,因为我自己不使用PHP。 然而,来自jqGrid下载页面的演示文件似乎包含一些PHP代码示例,可能对您有所帮助。

感谢前一位作者提出的问题解决方案的起点。 这里准备使用一块server-side PHP代码实现搜索请求(来自jqGrid )处理:

 $filters = $_POST['filters']; $search = $_POST['_search']; $where = ""; if(($search==true) &&($filters != "")) { $filters = json_decode($filters); $where = " where "; $whereArray = array(); $rules = $filters->rules; $groupOperation = $filters->groupOp; foreach($rules as $rule) { $fieldName = $rule->field; $fieldData = mysql_real_escape_string($rule->data); switch ($rule->op) { case "eq": $fieldOperation = " = '".$fieldData."'"; break; case "ne": $fieldOperation = " != '".$fieldData."'"; break; case "lt": $fieldOperation = " < '".$fieldData."'"; break; case "gt": $fieldOperation = " > '".$fieldData."'"; break; case "le": $fieldOperation = " <= '".$fieldData."'"; break; case "ge": $fieldOperation = " >= '".$fieldData."'"; break; case "nu": $fieldOperation = " = ''"; break; case "nn": $fieldOperation = " != ''"; break; case "in": $fieldOperation = " IN (".$fieldData.")"; break; case "ni": $fieldOperation = " NOT IN '".$fieldData."'"; break; case "bw": $fieldOperation = " LIKE '".$fieldData."%'"; break; case "bn": $fieldOperation = " NOT LIKE '".$fieldData."%'"; break; case "ew": $fieldOperation = " LIKE '%".$fieldData."'"; break; case "en": $fieldOperation = " NOT LIKE '%".$fieldData."'"; break; case "cn": $fieldOperation = " LIKE '%".$fieldData."%'"; break; case "nc": $fieldOperation = " NOT LIKE '%".$fieldData."%'"; break; default: $fieldOperation = ""; break; } if($fieldOperation != "") $whereArray[] = $fieldName.$fieldOperation; } if (count($whereArray)>0) { $where .= join(" ".$groupOperation." ", $whereArray); } else { $where = ""; } } // evaluating $sidx, $sord, $start, $limit $SQL = "SELECT id, brandName, name, description FROM products".$where." ORDER BY $sidx $sord LIMIT $start , $limit"; $result = mysql_query( $SQL ) or die("Couldn't execute query.".mysql_error()); 

您可能想要尝试此代码最简单的情况:

  $filters = $_GET['filters']; $where = ""; if (isset($filters)) { $filters = json_decode($filters); $where = " where "; $whereArray = array(); $rules = $filters->rules; foreach($rules as $rule) { $whereArray[] = $rule->field." like '%".$rule->data."%'"; } if (count($whereArray)>0) { $where .= join(" and ", $whereArray); } else { $where = ""; } } 

在生产中使用之前,请确保在$ _GET [‘filters’]包含垃圾而不是json时处理案例,并且正确转义字段名称/值。 否则SLQ注射有足够的空间。

感谢您发布您的代码!

唯一的变化是我不得不在’filters’参数中使用双引号来使它工作:

$ filters = str_replace(’\“’,’”’,$ _ POST [‘filters’]);