未捕获的TypeError:无法读取属性' length'尝试使用PHP填充响应数据表时未定义?

时间:2015-06-28 08:14:58

标签: php jquery html ajax datatables

我正在尝试将带有AJAX请求的响应式数据表填充到PHP脚本中,响应以JSON_encode格式返回,我可以在XHR请求中看到响应:

["abc","def","ght","jkl"]

以下是我正在使用的代码:

<table class="table table-striped table-bordered table-hover" id="dataTables-example">
  <thead>
    <tr>
      <th>Name</th>
    </tr>
  </thead>
  <tfoot>
    <tr>
      <th>Name</th>
    </tr>
  </tfoot>
</table>
$('#dataTables-example').DataTable({
  responsive: true,
  "ajax": "search_autocomplete.php",
});

这是PHP脚本:

if ($result->num_rows >0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    $list[] =$row['name'];
  }     
  echo json_encode( $list );            
}

4 个答案:

答案 0 :(得分:2)

如果要插入数组数据源,即不是对象文字,则源必须是数组数组:

[["abc"],["def"],["ght"],["jkl"]]
$('#dataTables-example').DataTable({
  "ajax": {
    url: "search_autocomplete.php",
    dataSrc: ''
  }
});
if ($result->num_rows >0) {
  while($row = $result->fetch_assoc()) {
    $list[] = array($row['name']); //<----
  }     
  echo json_encode($list);            
}

如果您使用Jonathans建议,json_encode( array(data => $list))也是如此 - 您仍然需要将每个项目包装到数组中,否则您将获得ad,{{因为dataTables将每个字符串作为它所期望的数组访问,所以每个字符都被视为一个数组项,即列的数据。

g
if ($result->num_rows >0) {
  while($row = $result->fetch_assoc()) {
    $list[] = array($row['name']); //<----
  }     
  echo json_encode(array('data' => $list));
}

答案 1 :(得分:1)

When using just a string value,至少,DataTables的ajax选项希望将响应包装在另一个对象中:

  

请注意,DataTables期望表数据是对象的data参数中的项数组...

{
    "data": [
        // row 1 data source,
        // row 2 data source,
        // etc
    ]
}

要实现此目的,您可以在编码之前将$list打包到另一个array()中:

echo json_encode( array( data => $list ) );

答案 2 :(得分:0)

设置Json标题

header('Content-type: application/json');
echo json_encode( $list ); 

答案 3 :(得分:0)

您还应该在$list循环之前定义变量while。如果未定义,则仅返回姓氏。

$list = []