It took me some time. But I found out where I was wrong, and now I have DataTables working with SQL Server through server-side scripts. I am posting this solution in the hope that it will help someone else like me, I am having problems. I have broken my answer into pieces.
PHP environment
SQLSRV drivers for php can be found here . Download the SQLSRV30.EXE installation package. You may find that when you try to run this executable, you will receive the error message "This is not a valid win32 application." If so, unzip the executable with something like 7-zip. As a result, the file will have the files you need inside.
When you unpacked the package, you need to select the correct driver. Most Windows installations use unsafe drivers:
php version 5.3:
php_sqlsrv_53_nts.dll
php_pdo_sqlsrv_53_nts.dll
php version 5.4:
php_sqlsrv_54_nts.dll
php_pdo_sqlsrv_54_nts.dll
Copy the appropriate files to the ext folder in your php directory. Now modify the php.ini file to have a link to these files. Do this by adding an entry to the dynamic extensions section. The result will be something like this:
extension=php_sqlsrv_54_nts.dll
Then add the section for the driver in the settings section of the module section, for example:
[sqlsrv] sqlsrv.LogSubSystems=-1 sqlsrv.LogSeverity=-1 sqlsrv.WarningsReturnAsErrors=0
Documentation on these parameters can be found here .
After you add these drivers and add a link to them in the php.ini file, you should also make sure that the Microsoft SQL Server 2012 client profile is also installed.
These links were taken from PHP.net:
Microsoft SQL Server 2012 x86 Client Profile Microsoft SQL Server 2012 x64 Client Profile
After completing these steps, restart the web server. The driver should now be installed and ready to use. You can verify this using the info.php page.
Server side Script:
Now that the web server is configured to use the SQL SRV driver, we can now use it to query the SQL Server database. I used the server side of the script here . Here are a few issues I found with him:
<?php $sIndexColumn = ""; $sTable = ""; $gaSql['user'] = ""; $gaSql['password'] = ""; $gaSql['db'] = ""; $gaSql['server'] = ""; $aColumns = array(); $connectionInfo = array("UID" => $gaSql['user'], "PWD" => $gaSql['password'], "Database"=>$gaSql['db'],"ReturnDatesAsStrings"=>true); $gaSql['link'] = sqlsrv_connect( $gaSql['server'], $connectionInfo); $params = array(); $options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET ); $sOrder = ""; if ( isset( $_GET['iSortCol_0'] ) ) { $sOrder = "ORDER BY "; for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ ) { if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" ) { $sOrder .= $aColumns[ intval( $_GET['iSortCol_'.$i] ) ]." ".addslashes( $_GET['sSortDir_'.$i] ) .", "; } } $sOrder = substr_replace( $sOrder, "", -2 ); if ( $sOrder == "ORDER BY" ) { $sOrder = ""; } } $sWhere = ""; if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" ) { $sWhere = "WHERE ("; for ( $i=0 ; $i<count($aColumns) ; $i++ ) { $sWhere .= $aColumns[$i]." LIKE '%".addslashes( $_GET['sSearch'] )."%' OR "; } $sWhere = substr_replace( $sWhere, "", -3 ); $sWhere .= ')'; } for ( $i=0 ; $i<count($aColumns) ; $i++ ) { if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' ) { if ( $sWhere == "" ) { $sWhere = "WHERE "; } else { $sWhere .= " AND "; } $sWhere .= $aColumns[$i]." LIKE '%".addslashes($_GET['sSearch_'.$i])."%' "; } } $top = (isset($_GET['iDisplayStart']))?((int)$_GET['iDisplayStart']):0 ; $limit = (isset($_GET['iDisplayLength']))?((int)$_GET['iDisplayLength'] ):10; $sQuery = "SELECT TOP $limit ".implode(",",$aColumns)." FROM $sTable $sWhere ".(($sWhere=="")?" WHERE ":" AND ")." $sIndexColumn NOT IN ( SELECT $sIndexColumn FROM ( SELECT TOP $top ".implode(",",$aColumns)." FROM $sTable $sWhere $sOrder ) as [virtTable] ) $sOrder"; $rResult = sqlsrv_query($gaSql['link'],$sQuery) or die("$sQuery: " . sqlsrv_errors()); $sQueryCnt = "SELECT * FROM $sTable $sWhere"; $rResultCnt = sqlsrv_query( $gaSql['link'], $sQueryCnt ,$params, $options) or die (" $sQueryCnt: " . sqlsrv_errors()); $iFilteredTotal = sqlsrv_num_rows( $rResultCnt ); $sQuery = " SELECT * FROM $sTable "; $rResultTotal = sqlsrv_query( $gaSql['link'], $sQuery ,$params, $options) or die(sqlsrv_errors()); $iTotal = sqlsrv_num_rows( $rResultTotal ); $output = array( "sEcho" => intval($_GET['sEcho']), "iTotalRecords" => $iTotal, "iTotalDisplayRecords" => $iFilteredTotal, "aaData" => array() ); while ( $aRow = sqlsrv_fetch_array( $rResult ) ) { $row = array(); for ( $i=0 ; $i<count($aColumns) ; $i++ ) { if ( $aColumns[$i] != ' ' ) { $v = $aRow[ $aColumns[$i] ]; $v = mb_check_encoding($v, 'UTF-8') ? $v : utf8_encode($v); $row[]=$v; } } If (!empty($row)) { $output['aaData'][] = $row; } } echo json_encode( $output ); ?>
Indexed column
When you specify an indexed column to use for searches, make sure it is included in the column array! if you do not specify which columns to use paging, this will not work. Data paging with this code works by executing a query to select all primary keys, if not in the TOP X results from another query.
Connection options
Make sure the connection settings are complete and correct. They are needed to allow the script to connect to the database. If there are no parameters or the parameters are incorrect for entering the SQL server, then the script will never be able to connect to the database.
Column array
I found that using this code without the specified columns returns invalid or NULL data. The best way to stop this is to populate the array with the column names that I would like to select each, enclosed in quotation marks and separated by commas. This is also reasonable, because why send the client anything but the required data?
Client side
HTML
DataTables require a well-formed html table. This means a table with full tags. If all tags are missing for the returned data, then DataTables will return an error. If you have columns that you want to return but not show, you can use exVort ColVis and set the default column setting in java script.
Datatable uses its own CCS file, so be sure to include it!
java script
DataTables uses jQuery and its own Javascrpt file, so make sure you include references to them in your script tags!
//Datatables Basic server side initilization $(document).ready(function () { //Datatable var table = $('#tableID').DataTable({ "bProcessing": true, "bServerSide": true, "sAjaxSource": "serverSideScript.php" }); });
These are the basic functions necessary for this server side script to work. It will receive the first 10 lines at the initial draw, using the database options that you specify on the php page. Here you can add the necessary extensions, such as ColVis and TableTools . Full documentation for these extensions and other data table initialization options can be found here .
I hope this answer helps everyone who has the same problems as mine.