php 使用 Datatables v1.10.0 进行服务器端处理

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23516519/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 16:46:53  来源:igfitidea点击:

Server Side processing with Datatables v1.10.0

phpjquerysqldatatable

提问by Tinydan

Hi I'm having some issues getting the server side processing functionality of data tables to work with SQL Server.

嗨,我在使数据表的服务器端处理功能与 SQL Server 一起工作时遇到了一些问题。

I've got a test page that should display two columns from a database table(for now).

我有一个测试页面,它应该显示数据库表中的两列(目前)。

HTML:

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="Stylesheet" type="text/css" href="DataTables-1.10.0/media/css/jquery.dataTables.min.css" />
</head>
<body>
<table id="example" class="display" cellspacing="0" width="100%">
<thead>
    <tr>
            <th align="center">PK</th>
            <th align="center">Network</th>               
    </tr>
</thead>

<tfoot>
    <tr>
            <th align="center">PK</th>
            <th align="center">Network</th>               
    </tr>
</tfoot>
</table>
</body>
<script type="text/javascript" src="DataTables-1.10.0/media/js/jquery.js"></script>
<script type="text/javascript" src="DataTables-1.10.0/media/js/jquery.dataTables.min.js">

</script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function () {
    $('#example').dataTable({
        "processing": true,
        "bServerSide": true,
        "ajax": "PHP/testGetArchive.php"
    });
});
</script>

</html>

I'm using the example code found on the website Here for the server side functions:

我正在使用网站上的示例代码 Here 用于服务器端功能:

http://next.datatables.net/examples/server_side/simple.html

http://next.datatables.net/examples/server_side/simple.html

This is my version of the php page being called:

这是我调用的 php 页面版本:

<?php

/*
 * DataTables example server-side processing script.
 *
 * Please note that this script is intentionally extremely simply to show how
 * server-side processing can be implemented, and probably shouldn't be used as
 * the basis for a large complex system. It is suitable for simple use cases as
 * for learning.
 *
 * See http://datatables.net/usage/server-side for full details on the server-
 * side processing requirements of DataTables.
 *
 * @license MIT - http://datatables.net/license_mit
 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Easy set variables
 */

// DB table to use
$table = 'tblViews';

// Table's primary key
$primaryKey = 'PK';

// Array of database columns which should be read and sent back to DataTables.
// The `db` parameter represents the column name in the database, while the `dt`
// parameter represents the DataTables column identifier. In this case simple
// indexes
$columns = array(
    array( 'db' => 'PK', 'dt' => 0 ),
    array( 'db' => 'Network',  'dt' => 1 )
);

// SQL server connection information
$sql_details = array(
    'user' => '******',
    'pass' => '******',
    'db'   => '******db',
    'host' => '******\SQLEXPRESS'
);


/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * If you just want to use the basic configuration for DataTables with PHP
 * server-side, there is no need to edit below this line.
 */

require( 'ssp.class.php' );

echo json_encode(
    SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
);

This then calls the second example PHP found here:

然后调用此处找到的第二个 PHP 示例:

https://github.com/DataTables/DataTables/blob/master/examples/server_side/scripts/ssp.class.php

https://github.com/DataTables/DataTables/blob/master/examples/server_side/scripts/ssp.class.php

Here is my Copy of it. The only Modification I performed was to remove the block of code that is required for the examples.

这是我的副本。我执行的唯一修改是删除示例所需的代码块。

<?php

/*
 * Helper functions for building a DataTables server-side processing SQL query
 *
 * The static functions in this class are just helper functions to help build
 * the SQL used in the DataTables demo server-side processing scripts. These
 * functions obviously do not represent all that can be done with server-side
 * processing, they are intentionally simple to show how it works. More complex
 * server-side processing operations will likely require a custom script.
 *
 * See http://datatables.net/usage/server-side for full details on the server-
 * side processing requirements of DataTables.
 *
 * @license MIT - http://datatables.net/license_mit
 */

class SSP {
    /**
     * Create the data output array for the DataTables rows
     *
     *  @param  array $columns Column information array
     *  @param  array $data    Data from the SQL get
     *  @return array          Formatted data in a row based format
     */
    static function data_output ( $columns, $data )
    {
        $out = array();

        for ( $i=0, $ien=count($data) ; $i<$ien ; $i++ ) {
            $row = array();

            for ( $j=0, $jen=count($columns) ; $j<$jen ; $j++ ) {
                $column = $columns[$j];

                // Is there a formatter?
                if ( isset( $column['formatter'] ) ) {
                    $row[ $column['dt'] ] = $column['formatter']( $data[$i][ $column['db'] ], $data[$i] );
                }
                else {
                    $row[ $column['dt'] ] = $data[$i][ $columns[$j]['db'] ];
                }
            }

            $out[] = $row;
        }

        return $out;
    }


    /**
     * Paging
     *
     * Construct the LIMIT clause for server-side processing SQL query
     *
     *  @param  array $request Data sent to server by DataTables
     *  @param  array $columns Column information array
     *  @return string SQL limit clause
     */
    static function limit ( $request, $columns )
    {
        $limit = '';

        if ( isset($request['start']) && $request['length'] != -1 ) {
            $limit = "LIMIT ".intval($request['start']).", ".intval($request['length']);
        }

        return $limit;
    }


    /**
     * Ordering
     *
     * Construct the ORDER BY clause for server-side processing SQL query
     *
     *  @param  array $request Data sent to server by DataTables
     *  @param  array $columns Column information array
     *  @return string SQL order by clause
     */
    static function order ( $request, $columns )
    {
        $order = '';

        if ( isset($request['order']) && count($request['order']) ) {
            $orderBy = array();
            $dtColumns = SSP::pluck( $columns, 'dt' );

            for ( $i=0, $ien=count($request['order']) ; $i<$ien ; $i++ ) {
                // Convert the column index into the column data property
                $columnIdx = intval($request['order'][$i]['column']);
                $requestColumn = $request['columns'][$columnIdx];

                $columnIdx = array_search( $requestColumn['data'], $dtColumns );
                $column = $columns[ $columnIdx ];

                if ( $requestColumn['orderable'] == 'true' ) {
                    $dir = $request['order'][$i]['dir'] === 'asc' ?
                        'ASC' :
                        'DESC';

                    $orderBy[] = '`'.$column['db'].'` '.$dir;
                }
            }

            $order = 'ORDER BY '.implode(', ', $orderBy);
        }

        return $order;
    }


    /**
     * Searching / Filtering
     *
     * Construct the WHERE clause for server-side processing SQL query.
     *
     * NOTE this does not match the built-in DataTables filtering which does it
     * word by word on any field. It's possible to do here performance on large
     * databases would be very poor
     *
     *  @param  array $request Data sent to server by DataTables
     *  @param  array $columns Column information array
     *  @param  array $bindings Array of values for PDO bindings, used in the
     *    sql_exec() function
     *  @return string SQL where clause
     */
    static function filter ( $request, $columns, &$bindings )
    {
        $globalSearch = array();
        $columnSearch = array();
        $dtColumns = SSP::pluck( $columns, 'dt' );

        if ( isset($request['search']) && $request['search']['value'] != '' ) {
            $str = $request['search']['value'];

            for ( $i=0, $ien=count($request['columns']) ; $i<$ien ; $i++ ) {
                $requestColumn = $request['columns'][$i];
                $columnIdx = array_search( $requestColumn['data'], $dtColumns );
                $column = $columns[ $columnIdx ];

                if ( $requestColumn['searchable'] == 'true' ) {
                    $binding = SSP::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
                    $globalSearch[] = "`".$column['db']."` LIKE ".$binding;
                }
            }
        }

        // Individual column filtering
        for ( $i=0, $ien=count($request['columns']) ; $i<$ien ; $i++ ) {
            $requestColumn = $request['columns'][$i];
            $columnIdx = array_search( $requestColumn['data'], $dtColumns );
            $column = $columns[ $columnIdx ];

            $str = $requestColumn['search']['value'];

            if ( $requestColumn['searchable'] == 'true' &&
             $str != '' ) {
                $binding = SSP::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
                $columnSearch[] = "`".$column['db']."` LIKE ".$binding;
            }
        }

        // Combine the filters into a single string
        $where = '';

        if ( count( $globalSearch ) ) {
            $where = '('.implode(' OR ', $globalSearch).')';
        }

        if ( count( $columnSearch ) ) {
            $where = $where === '' ?
                implode(' AND ', $columnSearch) :
                $where .' AND '. implode(' AND ', $columnSearch);
        }

        if ( $where !== '' ) {
            $where = 'WHERE '.$where;
        }

        return $where;
    }


    /**
     * Perform the SQL queries needed for an server-side processing requested,
     * utilising the helper functions of this class, limit(), order() and
     * filter() among others. The returned array is ready to be encoded as JSON
     * in response to an SSP request, or can be modified if needed before
     * sending back to the client.
     *
     *  @param  array $request Data sent to server by DataTables
     *  @param  array $sql_details SQL connection details - see sql_connect()
     *  @param  string $table SQL table to query
     *  @param  string $primaryKey Primary key of the table
     *  @param  array $columns Column information array
     *  @return array          Server-side processing response array
     */
    static function simple ( $request, $sql_details, $table, $primaryKey, $columns )
    {
        $bindings = array();
        $db = SSP::sql_connect( $sql_details );

        // Build the SQL query string from the request
        $limit = SSP::limit( $request, $columns );
        $order = SSP::order( $request, $columns );
        $where = SSP::filter( $request, $columns, $bindings );

        // Main query to actually get the data
        $data = SSP::sql_exec( $db, $bindings,
            "SELECT SQL_CALC_FOUND_ROWS `".implode("`, `", SSP::pluck($columns, 'db'))."`
             FROM `$table`
             $where
             $order
             $limit"
        );

        // Data set length after filtering
        $resFilterLength = SSP::sql_exec( $db,
            "SELECT FOUND_ROWS()"
        );
        $recordsFiltered = $resFilterLength[0][0];

        // Total data set length
        $resTotalLength = SSP::sql_exec( $db,
            "SELECT COUNT(`{$primaryKey}`)
             FROM   `$table`"
        );
        $recordsTotal = $resTotalLength[0][0];


        /*
         * Output
         */
        return array(
            "draw"            => intval( $request['draw'] ),
            "recordsTotal"    => intval( $recordsTotal ),
            "recordsFiltered" => intval( $recordsFiltered ),
            "data"            => SSP::data_output( $columns, $data )
        );
    }


    /**
     * Connect to the database
     *
     * @param  array $sql_details SQL server connection details array, with the
     *   properties:
     *     * host - host name
     *     * db   - database name
     *     * user - user name
     *     * pass - user password
     * @return resource Database connection handle
     */
    static function sql_connect ( $sql_details )
    {
        try {
            $db = @new PDO(
                "mysql:host={$sql_details['host']};dbname={$sql_details['db']}",
                $sql_details['user'],
                $sql_details['pass'],
                array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION )
            );
        }
        catch (PDOException $e) {
            SSP::fatal(
                "An error occurred while connecting to the database. ".
                "The error reported by the server was: ".$e->getMessage()
            );
        }

        return $db;
    }


    /**
     * Execute an SQL query on the database
     *
     * @param  resource $db  Database handler
     * @param  array    $bindings Array of PDO binding values from bind() to be
     *   used for safely escaping strings. Note that this can be given as the
     *   SQL query string if no bindings are required.
     * @param  string   $sql SQL query to execute.
     * @return array         Result from the query (all rows)
     */
    static function sql_exec ( $db, $bindings, $sql=null )
    {
        // Argument shifting
        if ( $sql === null ) {
            $sql = $bindings;
        }

        $stmt = $db->prepare( $sql );
        //echo $sql;

        // Bind parameters
        if ( is_array( $bindings ) ) {
            for ( $i=0, $ien=count($bindings) ; $i<$ien ; $i++ ) {
                $binding = $bindings[$i];
                $stmt->bindValue( $binding['key'], $binding['val'], $binding['type'] );
            }
        }

        // Execute
        try {
            $stmt->execute();
        }
        catch (PDOException $e) {
            SSP::fatal( "An SQL error occurred: ".$e->getMessage() );
        }

        // Return all
        return $stmt->fetchAll();
    }


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * Internal methods
     */

    /**
     * Throw a fatal error.
     *
     * This writes out an error message in a JSON string which DataTables will
     * see and show to the user in the browser.
     *
     * @param  string $msg Message to send to the client
     */
    static function fatal ( $msg )
    {
        echo json_encode( array( 
            "error" => $msg
        ) );

        exit(0);
    }

    /**
     * Create a PDO binding key which can be used for escaping variables safely
     * when executing a query with sql_exec()
     *
     * @param  array &$a    Array of bindings
     * @param  *      $val  Value to bind
     * @param  int    $type PDO field type
     * @return string       Bound key to be used in the SQL where this parameter
     *   would be used.
     */
    static function bind ( &$a, $val, $type )
    {
        $key = ':binding_'.count( $a );

        $a[] = array(
            'key' => $key,
            'val' => $val,
            'type' => $type
        );

        return $key;
    }


    /**
     * Pull a particular property from each assoc. array in a numeric array, 
     * returning and array of the property values from each item.
     *
     *  @param  array  $a    Array to get data from
     *  @param  string $prop Property to read
     *  @return array        Array of property values
     */
    static function pluck ( $a, $prop )
    {
        $out = array();

        for ( $i=0, $len=count($a) ; $i<$len ; $i++ ) {
            $out[] = $a[$i][$prop];
        }

        return $out;
    }
}

I keep getting an error saying that the code cannot find the driver though I've got the sqlserv and pdo_sqlsrv Drivers installed din my php environment. Is there something wrong on the code that's causing this error? Are my drivers incorrect? Any help with this would be appreciated. I've got upwards of 65,000 rows of data to process and to send that all to the client in one go will be impossible.

我不断收到错误消息,说代码找不到驱动程序,尽管我已经在我的 php 环境中安装了 sqlserv 和 pdo_sqlsrv 驱动程序。导致此错误的代码是否有问题?我的驱动程序不正确吗?对此的任何帮助将不胜感激。我有超过 65,000 行数据需要处理,并且一次性将所有数据发送给客户端是不可能的。

回答by Tinydan

It took me a while But I've found out where I was going wrong and I now have DataTables working with SQL Server through server side scripts. I'm posting this solution in the hope that it will help anyone else like me who was having issues. I've broken my answer into parts.

我花了一些时间但是我已经找到了我出错的地方,我现在通过服务器端脚本使用 SQL Server 的 DataTables。我发布此解决方案是希望它能帮助像我这样遇到问题的其他人。我已经把我的答案分成了几部分。

The PHP Environment

PHP 环境

The SQLSRV drivers for php can be found here. Download the SQLSRV30.EXE installer package. You may find that when you try and run this executable that you get the error "This is not a valid win32 application" If this is the case unzip the executable with something like 7-zip. The resulting file will have the files you require inside.

可以在此处找到用于 php 的 SQLSRV 驱动程序。下载 SQLSRV30.EXE 安装程序包。您可能会发现,当您尝试运行此可执行文件时,会收到错误“这不是有效的 win32 应用程序”,如果是这种情况,请使用 7-zip 之类的文件解压缩可执行文件。生成的文件将包含您需要的文件。

When you've unzipped the package you need to select the right driver. Most windows installations use the non thread safe drivers these are:

解压缩包后,您需要选择正确的驱动程序。大多数 Windows 安装使用非线程安全驱动程序,它们是:

php version 5.3:

php 5.3 版:

php_sqlsrv_53_nts.dll

php_sqlsrv_53_nts.dll

php_pdo_sqlsrv_53_nts.dll

php_pdo_sqlsrv_53_nts.dll

php version 5.4:

php 5.4 版:

php_sqlsrv_54_nts.dll

php_sqlsrv_54_nts.dll

php_pdo_sqlsrv_54_nts.dll

php_pdo_sqlsrv_54_nts.dll

Copy the appropriate files to the ext folder within your php directory. Now modify your php.ini file to have a reference to these files. Do this by adding an entry under the dynamic extensions section. The result would be something like this:

将适当的文件复制到 php 目录中的 ext 文件夹。现在修改您的 php.ini 文件以引用这些文件。通过在动态扩展部分下添加一个条目来做到这一点。结果将是这样的:

extension=php_sqlsrv_54_nts.dll

And then add a section for the driver under the Module section settings like this:

然后在 Module 部分设置下为驱动程序添加一个部分,如下所示:

[sqlsrv]
sqlsrv.LogSubSystems=-1
sqlsrv.LogSeverity=-1
sqlsrv.WarningsReturnAsErrors=0

The documentation for these settings can be found here.

可以在此处找到这些设置的文档。

Once you have added these drivers and added a reference to them in the php.ini file you must also ensure that the Microsoft SQL Server Client Profile 2012 is also installed.

添加这些驱动程序并在 php.ini 文件中添加对它们的引用后,您还必须确保还安装了 Microsoft SQL Server Client Profile 2012。

These Links have been taken from the PHP.net website:

这些链接取自 PHP.net 网站:

Microsoft SQL Server Client Profile 2012 x86Microsoft SQL Server Client profile 2012 x64

Microsoft SQL Server 客户端配置文件 2012 x86 Microsoft SQL Server 客户端配置文件 2012 x64

Once you have performed these steps restart your web server. The driver should now be installed and ready to use. You can check this using your info.php page.

执行完这些步骤后,重新启动 Web 服务器。驱动程序现在应该已经安装并可以使用了。您可以使用 info.php 页面进行检查。

The Server Side Script:

服务器端脚本:

Now that the web-server has been configured to use the SQL SRV driver we can now use it to query a SQL Server database. I've used the server side script available here. Here are some issues I found with it:

现在 Web 服务器已配置为使用 SQL SRV 驱动程序,我们现在可以使用它来查询 SQL Server 数据库。我使用了此处提供的服务器端脚本。以下是我发现的一些问题:

<?php
    /* Indexed column (used for fast and accurate table cardinality) */
    $sIndexColumn = "";

    /* DB table to use */
    $sTable = "";

    /* Database connection information */
    $gaSql['user']       = "";
    $gaSql['password']   = "";
    $gaSql['db']         = "";
    $gaSql['server']     = "";

    /*
    * Columns
    * If you don't want all of the columns displayed you need to hardcode $aColumns array with your elements.
    * If not this will grab all the columns associated with $sTable
    */
    $aColumns = array();


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * If you just want to use the basic configuration for DataTables with PHP server-side, there is
     * no need to edit below this line
     */

    /*
     * ODBC connection
     */
    $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 );


    /* Ordering */
    $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 = "";
        }
    }

    /* Filtering */
    $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 .= ')';
    }
    /* Individual column filtering */
    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])."%' ";
        }
    }

    /* Paging */
    $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 );
?>

The Indexed Column

索引列

When you specify an indexed column to use for searches make sure that it is included in the column array! if you leave it out when specifying which columns to use the paging will not work. The paging of datatables with this code works be performing a select query of all primary keys when not in the TOP X results from another query.

当您指定用于搜索的索引列时,请确保它包含在列数组中!如果在指定要使用分页的列时省略它,则将不起作用。当不在来自另一个查询的 TOP X 结果中时,使用此代码对数据表进行分页的工作是对所有主键执行选择查询。

The Connection Parameters

连接参数

Ensure that the connection parameters are complete and correct. These are necessary to allow the script to connect to the database. If there aren't any parameters or the parameters are not correct to a SQL server login then the script will never be able to connect to the database.

确保连接参数完整正确。这些是允许脚本连接到数据库所必需的。如果没有任何参数或参数对 SQL 服务器登录不正确,则脚本将永远无法连接到数据库。

The Column Array

列数组

I found that using this code without specified columns returned incorrect or NULL data. The best way to stop this was to fill the array with the column names I wanted to select each enclosed by quotes and separated by commas. It also stands to reason as why send anything but the required data back to the client?

我发现在没有指定列的情况下使用此代码会返回错误或 NULL 数据。阻止这种情况的最好方法是用列名填充数组,我想选择每个用引号括起来并用逗号分隔的列名。这也有道理,为什么要向客户端发送除所需数据之外的任何内容?

The Client Side

客户端

HTML

HTML

DataTables requires a well formed html table to operate. This means having a table with full tags. If all of the tags are not there for the data being returned then DataTables will return an error. If you have columns that you want to return but not show then you can use the ColVis exntensionand set a default column view setting in the java script.

DataTables 需要一个格式良好的 html 表来操作。这意味着有一个带有完整标签的表格。如果返回的数据没有所有标签,则 DataTables 将返回错误。如果您有要返回但不显示的列,则可以使用ColVis 扩展并在 java 脚本中设置默认列视图设置。

Datatable uses its own CCS file so make sure you include it!

Datatable 使用自己的 CCS 文件,因此请确保包含它!

The java script

java脚本

DataTables uses Jquery and its own Javascrpt file so make sure you include references to them within your script tags!

DataTables 使用 Jquery 及其自己的 Javascrpt 文件,因此请确保在脚本标记中包含对它们的引用!

//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 required for this server side script to work. It will get the top 10 rows on initial draw using the database parameters you specify in the php page. From here you can add the extensions you want such as ColVisand TableTools. Full Documentation for these Extensions and other initialization options for data tables can be found here.

这些是此服务器端脚本工作所需的基本功能。它将使用您在 php 页面中指定的数据库参数获取初始绘制的前 10 行。从这里你可以添加你想要的扩展,比如ColVisTableTools。可以在此处找到这些扩展和其他数据表初始化选项的完整文档。

I Hope this answer helps anyone else who is having the same issues that I had.

我希望这个答案可以帮助任何与我遇到相同问题的人。