【问题标题】:How can I get jqGrid toolbar search working?如何让 jqGrid 工具栏搜索工作?
【发布时间】:2011-08-21 22:28:41
【问题描述】:

http://trirand.com/blog/jqgrid/jqgrid.html,在“3.7 版中的新功能”>“列搜索”下,有一种方法解释了搜索,但对我来说还没有用。我添加了:

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

以及示例中不太重要的代码。我的服务器看到的 JSON 请求略有不同,但没有 _search=true 也没有搜索词。

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

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

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

我怎样才能获得像页面文档一样的列搜索,我的服务器正在被适当的请求击中?

【问题讨论】:

  • 你能发布你使用的 jqGrid 代码吗?有使用id="toolbar"<table> 元素吗?您使用哪个版本的 jqGrid?
  • 该表有另一个我在代码中使用的 ID。我正在使用 jqGrid 4.0。

标签: javascript jquery search datagrid jqgrid


【解决方案1】:

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

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

【讨论】:

  • 是的,jqgrid 演示页面上的 PHP 代码不正确,因为它不包含任何搜索功能。为 sql... 引用未定义的 $where 子句变量...:-/
【解决方案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['filters'] 包含垃圾而不是 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()); 
    

    【讨论】:

      【解决方案4】:

      感谢您发布您的代码!

      唯一的变化是我必须取消 'filters' 参数中的双引号才能使其正常工作:

      $filters = str_replace('\"','"' ,$_POST['filters']);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        相关资源
        最近更新 更多