Невозможно использовать порядок и ограничение на стороне сервера Datatables с использованием сервера SQL - PullRequest
0 голосов
/ 16 октября 2018

Я столкнулся с проблемой переноса моего серверного кода с данными из MySQL на SQL-сервер.Мне удалось отобразить вывод, если я удалю эту конкретную строку на стороне сервера.

$ sql. = "ORDER BY".$ columns [$ requestData ['order'] [0] ['column']]. "". $ requestData ['order'] [0] ['dir']. "LIMIT". $ requestData ['start']. ",". $ requestData ['length']. "";

Но проблема в том, что я не могу заказать и ограничить количество отображаемых элементов.Как я заставлю этот код работать на сервере SQL?Пожалуйста, любая помощь будет большой помощью.Спасибо

Вот мой полный код для серверной части

 <?php require_once("../includes/connection.php");



$connection = sqlsrv_connect(DB_HOST, array( 'Database'=>DB_NAME, 'UID'=>DB_USER, 'PWD'=>DB_PASSWORD,"CharacterSet" => "UTF-8"));

    // /* Database connection end */

    if( $connection ) {

        }else{
            echo "Connection could not be established.<br />";
            die( print_r( sqlsrv_errors(), true));
        }




// // storing  request (ie, get/post) global array to a variable  
$requestData= $_REQUEST;


$columns = array( 
// datatable column index  => database column name
    0 =>'new_id', 
    1 => 'person_name',
    2=> 'given_name',
    3=> 'family_name'



);

// getting total number records without any search
$sql = "SELECT * , user.id as new_id  ";
$sql.=" FROM user LEFT JOIN user_additional on user.doc_id = user_additional.doc_id  LEFT JOIN users on users.id = user.user_name";
$query=sqlsrv_query($connection, $sql) ;

if( $query === false) {
    die( print_r( sqlsrv_errors(), true) );
}

$totalData = sqlsrv_num_rows($query);
$totalFiltered = $totalData;  // when there is no search parameter then total number rows = total number filtered rows.


$sql ="SELECT * , user.id as new_id  ";
$sql.=" FROM user LEFT JOIN user_additional on user.doc_id = user_additional.doc_id  LEFT JOIN users on users.id = user.user_name WHERE 1=1";
if( !empty($requestData['search']['value']) ) {   // if there is a search parameter, $requestData['search']['value'] contains search parameter

$sql.=" AND ( person_name LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR family_name LIKE '%".$requestData['search']['value']."%' ";

$sql.=" OR given_name LIKE '".$requestData['search']['value']."%' )";
}
$query=sqlsrv_query($connection, $sql) ;

if( $query === false) {
    die( print_r( sqlsrv_errors(), true) );
}

$totalFiltered = sqlsrv_num_rows($query); // when there is a search parameter then we have to modify total number filtered rows as per search result. 




$sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]."   ".$requestData['order'][0]['dir']."  LIMIT ".$requestData['start']." ,".$requestData['length']."   ";


/* $requestData['order'][0]['column'] contains colmun index, $requestData['order'][0]['dir'] contains order such as asc/desc  */    
$query=sqlsrv_query($connection, $sql) ;

if( $query === false) {
    die( print_r( sqlsrv_errors(), true) );
}

$data = array();
while( $row=sqlsrv_fetch_array($query) ) {  // preparing an array
    $nestedData=array(); 

    // $nestedData[]="";
    $nestedData[] = $row["new_id"];
    $nestedData[] = $row["person_name"];
    $nestedData[] = $row["given_name"];
    $nestedData[] = $row["family_name"];



    ;



    $data[] = $nestedData;
}



$json_data = array(
            "draw"            => intval( $requestData['draw'] ),   // for every request/draw by clientside , they send a number as a parameter, when they recieve a response/data they first check the draw number, so we are sending same number in draw. 
            "recordsTotal"    => intval( $totalData ),  // total number of records
            "recordsFiltered" => intval( $totalFiltered ), // total number of records after searching, if there is no searching then totalFiltered = totalData
            "data"            => $data   // total data array
        );

echo json_encode($json_data);  // send data as json format

?>

1 Ответ

0 голосов
/ 16 октября 2018

Если вы используете sql server 2012 или выше, вы можете использовать предложение OFFSET/FETCH NEXT n ROWS ONLY.Пример запроса для вашей справки:

SELECT Id, FirstName, LastName, Dept
  FROM Employee
  order by Id asc
  offset 100 rows
  fetch next 10 rows only

Пожалуйста, попробуйте после изменения кода, чтобы построить запрос, как указано выше. образец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...