jqGrid集成工具栏搜索不起作用

时间:2012-03-04 02:18:45

标签: php jquery mysql sql jqgrid

我正在尝试在我的页面上运行集成的搜索工具栏,但是我没有运气。常规搜索功能对我有用,但每当我在集成工具栏中输入任何内容时,它都会返回0结果。

这是我的jquery:

$("#parts_table").jqGrid({
            url:'testparts2.php',
            datatype: "json",
            colNames:['Part ID','Name', 'Description', 'Weight'],
            colModel:[
                {name:'part_ID',index:'part_ID', search: true, stype:'text', width:55},
                {name:'part_name',index:'part_name', width:90},
                {name:'part_desc',index:'part_desc', width:100},
                {name:'part_weight',index:'part_weight', width:80, align:"right"},      
            ],
            rowNum:30,
            rowList:[10,20,30],
            pager: '#pager2',
            sortname: 'part_ID',
            viewrecords: true,
            sortorder: "asc",
            caption:"Parts in Database",
            width: '800',
            height: '300',
        });
        $("#parts_table").jqGrid('navGrid','#pager2',{edit:false,add:false,del:false});
        $("#parts_table").jqGrid('filterToolbar',{stringResult: false,searchOnEnter : false, defaultSearch: 'cn', ignoreCase: true});

这是我的PHP代码:

<?php
    include "begin.php";
    $page = $_REQUEST['page']; // get the requested page
    $limit = $_REQUEST['rows']; // get how many rows we want to have into the grid
    $sidx = $_REQUEST['sidx']; // get index row - i.e. user click to sort
    $sord = $_REQUEST['sord']; // get the direction
    if(!$sidx) $sidx =1;

    //array to translate the search type
    $ops = array(
        'eq'=>'=', //equal
        'ne'=>'<>',//not equal
        'lt'=>'<', //less than
        'le'=>'<=',//less than or equal
        'gt'=>'>', //greater than
        'ge'=>'>=',//greater than or equal
        'bw'=>'LIKE', //begins with
        'bn'=>'NOT LIKE', //doesn't begin with
        'in'=>'LIKE', //is in
        'ni'=>'NOT LIKE', //is not in
        'ew'=>'LIKE', //ends with
        'en'=>'NOT LIKE', //doesn't end with
        'cn'=>'LIKE', // contains
        'nc'=>'NOT LIKE'  //doesn't contain
    );
    function getWhereClause($col, $oper, $val){
        global $ops;
        if($oper == 'bw' || $oper == 'bn') $val .= '%';
        if($oper == 'ew' || $oper == 'en' ) $val = '%'.$val;
        if($oper == 'cn' || $oper == 'nc' || $oper == 'in' || $oper == 'ni') $val = '%'.$val.'%';
        return " WHERE $col {$ops[$oper]} '$val' ";
    }
    $where = ""; //if there is no search request sent by jqgrid, $where should be empty
    $searchField = isset($_GET['searchField']) ? $_GET['searchField'] : false;
    $searchOper = isset($_GET['searchOper']) ? $_GET['searchOper']: false;
    $searchString = isset($_GET['searchString']) ? $_GET['searchString'] : false;
    if ($_GET['_search'] == 'true') {
        $where = getWhereClause($searchField,$searchOper,$searchString);
    }   

    $totalrows = isset($_REQUEST['totalrows']) ? $_REQUEST['totalrows']: false;
    if($totalrows) {
        $limit = $totalrows;
    }

    $result = mysql_query("SELECT COUNT(*) AS count FROM parts");
    $row = mysql_fetch_array($result,MYSQL_ASSOC);
    $count = $row['count'];

    if( $count >0 ) {
        $total_pages = ceil($count/$limit);
    } else {
        $total_pages = 0;
    }
    if ($page > $total_pages) $page=$total_pages;
    if ($limit<0) $limit = 0;
    $start = $limit*$page - $limit; // do not put $limit*($page - 1)
    if ($start<0) $start = 0;
    $SQL = "SELECT * FROM parts ".$where." ORDER BY $sidx $sord LIMIT $start , $limit";
    $result = mysql_query( $SQL ) or die("Couldn't execute query.".mysql_error());
    $response->page = $page;
    $response->total = $total_pages;
    $response->records = $count;
    $i=0;
    while($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
        $response->rows[$i]['part_ID']=$row[part_ID];
        $response->rows[$i]['cell']=array($row[part_ID],$row[part_name],$row[part_desc],$row[part_weight]);
        $i++;
    } 
    echo json_encode($response);

?>

我花了几个小时寻找一个适用于常规搜索的PHP示例(见上文),但它似乎不适用于工具栏搜索。有人可以帮忙吗?感谢

编辑:这是来自jqGrid演示文件夹的代码,用于使用此搜索,但它似乎充满了错误,我不知道如何在我的情况下使用它。我不需要为搜索指定数据类型(它们都是varchars,因此字符串可以正常工作)..所以我认为我可以去掉开关/案例部分以进行值转换。我想我只需要更改原始代码以使用$_REQUEST['filters']和foreach循环来构建查询,但我对PHP并不是那么好,所以任何帮助都会受到赞赏。

演示代码:

$wh = "";
$searchOn = Strip($_REQUEST['_search']);
if($searchOn=='true') {
    $searchstr = Strip($_REQUEST['filters']);
    $wh= constructWhere($searchstr);
    //echo $wh;
}
function constructWhere($s){
    $qwery = "";
    //['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
    $qopers = array(
                  'eq'=>" = ",
                  'ne'=>" <> ",
                  'lt'=>" < ",
                  'le'=>" <= ",
                  'gt'=>" > ",
                  'ge'=>" >= ",
                  'bw'=>" LIKE ",
                  'bn'=>" NOT LIKE ",
                  'in'=>" IN ",
                  'ni'=>" NOT IN ",
                  'ew'=>" LIKE ",
                  'en'=>" NOT LIKE ",
                  'cn'=>" LIKE " ,
                  'nc'=>" NOT LIKE " );
    if ($s) {
        $jsona = json_decode($s,true);
        if(is_array($jsona)){
            $gopr = $jsona['groupOp'];
            $rules = $jsona['rules'];
            $i =0;
            foreach($rules as $key=>$val) {
                $field = $val['field'];
                $op = $val['op'];
                $v = $val['data'];
                if($v && $op) {
                    $i++;
                    // ToSql in this case is absolutley needed
                    $v = ToSql($field,$op,$v);
                    if ($i == 1) $qwery = " AND ";
                    else $qwery .= " " .$gopr." ";
                    switch ($op) {
                        // in need other thing
                        case 'in' :
                        case 'ni' :
                            $qwery .= $field.$qopers[$op]." (".$v.")";
                            break;
                        default:
                            $qwery .= $field.$qopers[$op].$v;
                    }
                }
            }
        }
    }
    return $qwery;
}
function ToSql ($field, $oper, $val) {
    // we need here more advanced checking using the type of the field - i.e. integer, string, float
    switch ($field) {
        case 'id':
            return intval($val);
            break;
        case 'amount':
        case 'tax':
        case 'total':
            return floatval($val);
            break;
        default :
            //mysql_real_escape_string is better
            if($oper=='bw' || $oper=='bn') return "'" . addslashes($val) . "%'";
            else if ($oper=='ew' || $oper=='en') return "'%" . addcslashes($val) . "'";
            else if ($oper=='cn' || $oper=='nc') return "'%" . addslashes($val) . "%'";
            else return "'" . addslashes($val) . "'";
    }
}

$result = mysql_query("SELECT COUNT(*) AS count FROM invheader a, clients b WHERE a.client_id=b.client_id".$wh);
        $row = mysql_fetch_array($result,MYSQL_ASSOC);
        $count = $row['count'];

        if( $count >0 ) {
            $total_pages = ceil($count/$limit);
        } else {
            $total_pages = 0;
        }
        if ($page > $total_pages) $page=$total_pages;
        $start = $limit*$page - $limit; // do not put $limit*($page - 1)
        if ($start<0) $start = 0;
        $SQL = "SELECT a.id, a.invdate, b.name, a.amount,a.tax,a.total,a.note FROM invheader a, clients b WHERE a.client_id=b.client_id".$wh." ORDER BY ".$sidx." ".$sord. " LIMIT ".$start." , ".$limit;
        $result = mysql_query( $SQL ) or die("Could not execute query.".mysql_error());
        $responce->page = $page;
        $responce->total = $total_pages;
        $responce->records = $count;
        $i=0;
        while($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
            $responce->rows[$i]['id']=$row[id];
            $responce->rows[$i]['cell']=array($row[id],$row[invdate],$row[name],$row[amount],$row[tax],$row[total],$row[note]);
            $i++;
        } 
        //echo $json->encode($responce); // coment if php 5
        echo json_encode($responce);

1 个答案:

答案 0 :(得分:3)

我昨天自己也遇到过同样的问题。你是对的,你需要使用$ _REQUEST ['filters']引入过滤器,然后将其分解,以便你可以使用每一块。

首先,您需要在初始化FilterToolbar的jQuery文件中设置stringResult: true

以下是PHP将用于引入的代码,并分解filters对象:

// Gets the 'filters' object from JSON
$filterResultsJSON = json_decode($_REQUEST['filters']);

// Converts the 'filters' object into a workable Array
$filterArray = get_object_vars($filterResultsJSON);

现在你有$filterArray包含filters对象的内容,你现在可以分解其中包含的rules对象。基本上,$filterArray中还有另一个数组,其中包含搜索详细信息,如果用户尝试跨表中的多个列执行此搜索 - 它称为rules

以下是我如何分解rules对象并根据用户的输入执行SELECT查询:

// Begin the select statement by selecting cols from tbl
$sql = 'select '.implode(',',$crudColumns).' from '.$crudTableName;
// Init counter to 0
$counter = 0;
// Loop through the $filterArray until we process each 'rule' array inside
while($counter < count($filterArray['rules']))
{
// Convert the each 'rules' object into a workable Array
$filterRules = get_object_vars($filterArray['rules'][$counter]);

// If this is the first pass, start with the WHERE clause
if($counter == 0){
$sql .= ' WHERE ' . $filterRules['field'] . ' LIKE "%' . $filterRules['data'] . '%"';
}
// If this is the second or > pass, use AND
else {
$sql .= ' AND ' . $filterRules['field'] . ' LIKE "%' . $filterRules['data'] . '%"';
}
$counter++;
}

// Finish off the select statement
$sql .= ' ORDER BY ' . $postConfig['sortColumn'] . ' ' . $postConfig['sortOrder']; 
$sql .= ' LIMIT '.$intStart.','.$intLimit;

/* run the query */
$result = mysql_query( $sql )

我相信你会有疑问,所以请随时问你是否这样做!