数据表服务器端自动行ID

时间:2012-02-29 15:51:03

标签: jquery json datatables

我正在尝试渲染一个自动为每行插入和ID的DataTable。

根据http://datatables.net/release-datatables/examples/server_side/ids.html我明白了,如果我每行都传递一个DT_RowId“列”,它应该自动执行。

我正在使用他们在此提供的示例PHP:http://datatables.net/release-datatables/examples/data_sources/server_side.html

我创建了一个MySQL视图,它有一个动态表,它将表索引转换为名为DT_RowId的列,并添加到$ aColumns变量中,以便在JSON中输出。

该值以JSON格式打印,但没有任何反应。我99%肯定这是因为他们提供的PHP代码不会回显列的名称

在示例中,JSON应为:

"aaData": [
    {
      "0": "Gecko",
      "1": "Firefox 1.0",
      "2": "Win 98+ / OSX.2+",
      "3": "1.7",
      "4": "A",
      "DT_RowId": "row_7",
      "DT_RowClass": "gradeA"
    }, { ... }

但PHP输出无密钥

"aaData": [
    {
      "Gecko",
      "Firefox 1.0",
      "Win 98+ / OSX.2+",
      "1.7",
      "A",
      "row_7",
      "gradeA"
    }, {...}

看到我认为“客户端javascript应该如何知道行中的最后一列是DT_RowId?”。所以我编辑了PHP,用他们的例子中的关键数据输出JSON,然后我得到:

{
    "sEcho": 1,
    "iTotalRecords": "4",
    "iTotalDisplayRecords": "4",
    "aaData": [
        {
            "Nombre": "Some Name",
            "username": "some username",
            "Email": "some email",
            "lastModified": "0000-00-00 00:00:00",
            "lastLogin": "2012-02-23 12:04:55",
            "rolname": "Some string",
            "DT_RowId": "2"
        }, {...},{...},{...} ] }

但我收到一条警告说“ DataTables警告:请求未知参数'0'构成第0行的数据源

我的JSON格式与他们相似,我正在使用

"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "scripts/id.php"

所以我不知道为什么它不是DataTable渲染的有效JSON。我可能会错过一些愚蠢的东西,但我被困在这里。

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

我知道这已经过时了,但是我已经破解了这个问题,没有任何疯狂的jS代码或服务器端脚本。在使用“columns”功能键入之后,您必须为列命名:

var meowTable = $('#meow').dataTable( {
        "bProcessing": true,
        "bServerSide": true, 
        "sAjaxSource": "get_meow_table.php",
        "columns": [ //needed for when you have keys with JSON
            { "data": "meow" },
            { "data": "woof" },
            { "data": "moo" },
            { "data": "cluck" }
        ]
});

快乐的数据表......

答案 1 :(得分:0)

您称为“无密钥”的aaData是无效的json。 {}应为数组括号[]。我撤回了我的评论,除了括号问题

之外,数据格式正确

答案 2 :(得分:0)

我为愚蠢分配的空值得到了同样的错误。这是我错误的回应:

{"aaData": [
   null,
   {
      "0": "Gecko",
      "1": "Firefox 1.0",
      "DT_RowId": "row_7",
      "DT_RowClass": "gradeA"
   }, { ..row2.. }
 ]}

印制:

echo json_encode($out);

这就是我建立回应的方式:

function dittaInfoTable($db, $id) {
    $ret['aaData'][]=null; <-- wrong line to correct in $ret['aaData']=null;
    $res=$db->getA($id,$db->getTabDoc(),'id_ditta');
    $line=count($res);
    for($i=0;$i<$line;$i++){
        $row=array();
        $col=count($res[$i]);
        for ( $j=0 ; $j<$col ; $j++ ){
            if($j == $col - 1)
                $row['DT_RowId']= 'row_'.$res[$i][$j];
            else 
                $row[] = $res[$i][$j];
        }

        $ret['aaData'][]=$row;
    }

    return $ret;
}

这里我是如何从db获取数据的:

private function queryNotAss($sql){
     $this->last_sql=$sql;
     $arr=array();

     $r = mysqli_query($this->link,$sql);
     for ($i=0; $i<mysqli_num_rows($r);$i++)
        $arr[$i]=mysqli_fetch_row($r);

     return $arr;
}

所以是的,你的json响应中有一个糟糕的json行元素。

答案 3 :(得分:0)

这是我的方式:

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

while ( $aRow = $rResult->fetch_assoc() ) {
    $row = array();
    $row['DT_RowId'] = $aRow['id'];
    for ( $i=0 ; $i<$iColumnCount ; $i++ ) {
        if ( $aColumns[$i] == 'version' ) {
            // Special output formatting for 'version' column
            $row[] = ($aRow[ $aColumns[$i] ]=='0') ? '-' : $aRow[ $aColumns[$i] ];
        } elseif ( $aColumns[$i] != ' ' ) {
            // General output
            $row[] = $aRow[ $aColumns[$i] ];
        }
    }
    $output['aaData'][] = $row;
}

echo json_encode( $output );