douzhao5656 2015-10-01 16:14
浏览 241
已采纳

DataTables,数据库服务器端处理和“DataTables warning(table id ='example')”

There are many peoples experiencing the following error with DataTables and server side processing with Ajax, but I've tried many of them and read all, without any success.

DataTables warning (table id = 'example') - Invalid JSON response

I've also checked dev answers and they say that every time you that error is because you have or a json formatting problem, or a database connection problem or a column selection problem. Well it seems to me I have none of them.

My code (got from this example: here) is (try.php):

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<!-- DataTables CSS -->
<link rel="stylesheet" type="text/css"   href="//cdn.datatables.net/1.10.9/css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8"  src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"></script>

<title>test</title>
</head>

<body>
<table id="example">
    <thead>
        <tr>
            <th>ID</th>
            <th>country Name</th>
            <th>country Currency</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
 </table>
 <script type="text/javascript" charset="utf8" src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
 <script>
 $(document).ready(function() {
   $('#example').dataTable( {
      "bProcessing": true,
      "bServerSide": true,
      "sAjaxSource": "server_processing2.php"
   } );
 } );

 </script>
 </body>
 </html>

And here is server_processing2.php:

 <!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>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <title>Processing</title>
 </head>
 <body>
 <?php
 /*
 * Script:    DataTables server-side script for PHP and MySQL
 * Copyright: 2010 - Allan Jardine
 * License:   GPL v2 or BSD (3-point)
 */

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

 /* Array of database columns which should be read and sent back to DataTables. Use a space where
 * you want to insert a non-database field (for example a counter or static image)
 */
 $aColumns = array('ID', 'country_Name', 'country_Currency' );

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

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

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

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

 /* 
 * MySQL connection
 */
 $gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
    die( 'Could not open connection to server' );

 mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
    die( 'Could not select database '. $gaSql['db'] );


 /* 
 * Paging
 */
 $sLimit = "";
 if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
 {
    $sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
        mysql_real_escape_string( $_GET['iDisplayLength'] );
 }


 /*
 * Ordering
 */
 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] ) ]."
                ".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
        }
    }

    $sOrder = substr_replace( $sOrder, "", -2 );
    if ( $sOrder == "ORDER BY" )
    {
        $sOrder = "";
    }
 }


 /* 
 * Filtering
 * 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, but concerned about efficiency
 * on very large tables, and MySQL's regex functionality is very limited
 */
 $sWhere = "";
 if ( $_GET['sSearch'] != "" )
 {
    $sWhere = "WHERE (";
    for ( $i=0 ; $i<count($aColumns) ; $i++ )
    {
        $sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
    }
    $sWhere = substr_replace( $sWhere, "", -3 );
    $sWhere .= ')';
 }

 /* Individual column filtering */
 for ( $i=0 ; $i<count($aColumns) ; $i++ )
 {
    if ( $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
    {
        if ( $sWhere == "" )
        {
            $sWhere = "WHERE ";
        }
        else
        {
            $sWhere .= " AND ";
        }
        $sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' ";
    }
}


 /*
 * SQL queries
 * Get data to display
 */
 $sQuery = "
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
    FROM   $sTable
    $sWhere
    $sOrder
    $sLimit
 ";
 $rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());

 /* Data set length after filtering */
 $sQuery = "
    SELECT FOUND_ROWS()
 ";
 $rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
 $aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
 $iFilteredTotal = $aResultFilterTotal[0];

 /* Total data set length */
 $sQuery = "
    SELECT COUNT(".$sIndexColumn.")
    FROM   $sTable
 ";
 $rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
 $aResultTotal = mysql_fetch_array($rResultTotal);
 $iTotal = $aResultTotal[0];


 /*
 * Output
 */
 $output = array(
    "sEcho" => intval($_GET['sEcho']),
    "iTotalRecords" => $iTotal,
    "iTotalDisplayRecords" => $iFilteredTotal,
    "aaData" => array()
 );

 while ( $aRow = mysql_fetch_array( $rResult ) )
 {
    $row = array();
    for ( $i=0 ; $i<count($aColumns) ; $i++ )
    {
        if ( $aColumns[$i] == "version" )
        {
            /* Special output formatting for 'version' column */
            $row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ];
        }
        else if ( $aColumns[$i] != ' ' )
        {
            /* General output */
            $row[] = $aRow[ $aColumns[$i] ];
        }
    }
    $output['aaData'][] = $row;
 }
 echo json_encode( $output );
 ?>

 </body>
 </html>

Any try I've done, returned me that error but here is ARRAY I receive from server_processing2.php:

 {"sEcho":0,
  "iTotalRecords":"287",
  "iTotalDisplayRecords":"287",
  "aaData":[
     ["10768","Western Sahara","EH"],["10767","Vietnam","VND"],
     ["10765","Uzbekistan","UZS"],["10766","Venezuela","VEF"],       
     ["10764","USA","USD"],["10763","Uruguay","UYU"],["10762","United Kingdom","GBP"],
     ["10761","United Arab Emirates","AED"],["10760","Ukraine","UAH"],  
     ["10759","Uganda","UGX"],["10758","Turkmenistan","TMT"],.........   
     ["10546","Argentina","ARS"],["10545","Albania","ALL"],   
     ["10544","Afghanistan","AFN"]
   ]
 }

So I can assume that:

  • my database works correctly (data is correct);
  • JSON is well formatted (tested by JSON validator);
  • data arrived to try.php (trunked after some results, but I guess is because DataTable works with 10 results a time...

So why it doesn't work?

UPDATE

It works. There were (I guess) two problems:

  1. I needed to update DataTables to last versions
  2. As suggested I needed to eliminate html part from server side file.
  • 写回答

1条回答 默认 最新

  • douhao6557 2015-10-01 18:33
    关注

    You have HTML in your server_processing2.php. Remove everything except PHP code between <?php and ?> tags so it returns JSON only.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 plotBAPC画图出错
  • ¥30 关于#opencv#的问题:使用大疆无人机拍摄水稻田间图像,拼接成tif图片,用什么方法可以识别并框选出水稻作物行
  • ¥15 Python卡尔曼滤波融合
  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理