2011-05-09 55 views
4

http://trirand.com/blog/jqgrid/jqgrid.html,在“3.7新增功能”>“列搜索”下,有一种方法用于搜索,但它尚未适用于我。我已经添加了:如何让jqGrid工具栏搜索工作?

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没有定义(或引用)其他地方在页面上。

如何获得像页面文档那样的列搜索?在哪里我的服务器正在被适当的请求命中?

+0

你可以发布你使用的jqGrid代码吗?有'

'元素,你使用'id =“工具栏”'?您使用哪个版本的jqGrid? – Oleg2011-05-09 19:24:48

+0

表中有另一个我在代码中使用的ID。我正在使用jqGrid 4.0。 – JonathanHayward 2011-05-09 21:36:08

回答

7

应该在用于定义网格的相同元素上调用filterToolbar方法。看看the working example用过它。

我不能帮你解决你的问题的PHP部分,因为我自己不使用PHP。尽管如此,从the jqGrid download pagedemo files似乎包含一些PHP代码示例,这可能会对您有所帮助。

+0

是的演示页面上的jqgrid的PHP代码不正确,因为它没有包含任何搜索功能。引用sql的一个未定义的'$ where'子句变量...: - / – 2012-08-26 08:48:30

2

你可能想尝试最简单的情况下,该代码:

 $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 [“过滤器”]装着垃圾,而不是JSON和字段名称/值正确逃脱。否则SLQ注射有足够的空间。

3

感谢上一位作者提出的问题解决方案的出发点。这里是准备用一块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()); 
0

感谢张贴你的代码!

唯一的变化是,我曾在“过滤器”参数来取消转义双引号来得到它的工作:

$过滤器= str_replace函数(“\”““””,$ _ POST ['过滤器“]);

相关问题