Двойной запрос WHERE на стороне сервера для создания jqgrid json - PullRequest
0 голосов
/ 26 февраля 2019

Я использую серверную сторону для создания json в jqgrid.

Моя проблема заключается в том, что я хочу включить WHERE в запрос mySQL, потому что WHERE было использовано в операторе поиска.

  • Код на стороне сервера:

    <?php 
    
    include("dbconfig.php");
    $page = $_REQUEST['page']; 
    $limit = $_REQUEST['rows']; 
    $sidx = $_REQUEST['sidx']; 
    $sord = $_REQUEST['sord']; 
    
    // if we not pass at first time index use the first column for the index or what you want
    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
        '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);
    //  var_dump($where);
    
    }
    
     $totalrows = isset($_REQUEST['totalrows']) ? $_REQUEST['totalrows']: false;
    if($totalrows) {
        $limit = $totalrows;    
    }
    
    $db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error()); 
    mysql_select_db($database) or die("Error connecting to db."); 
     if ($limit<0) $limit = 0;
    // calculate the number of rows for the query. We need this for paging the result 
    $result = mysql_query("SELECT * FROM enemy_coords"); 
    $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;
    
    // the actual query for the grid data 
    $SQL = "SELECT * FROM enemy_coords ".$where." ORDER BY $sidx $sord LIMIT $start , $limit"; 
    $result = mysql_query( $SQL ) or die("Couldn't 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[ID],$row[alliance_name],$row[player_name],$row[player_lvl],$row[player_might],$row[city1_coords]);
        $i++;
    }        
    
    echo json_encode($responce);
    ?>
    

У меня вопрос, могу ли я изменить запрос mysql на

SELECT * FROM enemy_coords WHERE category <> 'A',
where should i put the "WHERE category = 'A'"?

1 Ответ

0 голосов
/ 27 февраля 2019

Здесь много вариантов.Один из возможных вариантов - установить начальное значение $ where для этого условия, а затем в зависимости от вашего требования добавить AND или OR для остальной части того места, где включен поиск.Для этого оператор WHERE должен быть удален из функции getWhereClause:

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 " $col {$ops[$oper]} '$val' ";
}
$where = "WHERE category = 'A'"; 
...
if ($_GET['_search'] == 'true') {
    $where = $where. " AND ". getWhereClause($searchField,$searchOper,$searchString);
//  var_dump($where);

}
...
// the actual query for the grid data 
$SQL = "SELECT * FROM enemy_coords ".$where." ORDER BY $sidx $sord LIMIT $start , $limit"; 
$result = mysql_query( $SQL ) or die("Couldn't execute query.".mysql_error()); 

Конечно, для выполнения этого штрафа необходимо выполнить больше условий проверки, но это всего лишь направление.

...