未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?

Posted

技术标签:

【中文标题】未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?【英文标题】:Uncaught TypeError: Cannot read property 'length' of undefined when trying to populate responsive datatable using PHP? 【发布时间】:2015-09-14 20:14:23 【问题描述】:

我正在尝试使用对 php 脚本的 AJAX 请求填充响应式数据表,响应以 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 );            

【问题讨论】:

【参考方案1】:

当你想插入一个数组数据源时,即不是对象字面量,源必须是一个数组数组:

[["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 =&gt; $list)) 也是如此 - 您仍然需要将每个项目包装到一个数组中,否则您会得到 adg 等,因为 dataTables 访问每个字符串作为它期望的数组,每个字符被视为一个数组项,一个列的数据。

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

$('#dataTables-example').DataTable(
  "ajax": "search_autocomplete.php"
);

【讨论】:

工作就像一个魅力非常感谢大家抽出时间【参考方案2】:

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 ) );

【讨论】:

感谢 jonathan,我的表收到了数据,但每行仅填充第一个字母 ex ["abc","def","ghi"] 第 1 行仅显示 'a' 和第二行2 显示“d”【参考方案3】:

设置 Json 标头

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

【讨论】:

是否需要定义标题,因为我可以在 chrome 开发者工具中看到响应【参考方案4】:

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

$list = []

【讨论】:

@njwin07 那是相关代码!请发布所有相关代码,没有它人们只会指出你实际上没有犯的错误,你得到一个好的答案的机会就会更小。

以上是关于未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?的主要内容,如果未能解决你的问题,请参考以下文章

数据表:未捕获的类型错误:无法读取未定义的属性“长度”?

未捕获的类型错误:$(...).ekkoLightbox 不是函数

尝试在 if 语句中检查 json 响应时出现未捕获(承诺)错误

错误:变量“无法隐式捕获,因为未指定默认捕获模式”

PHP致命错误:未捕获的错误:不能将stdClass类型的对象用作数组

数据表:未捕获的类型错误:无法读取未定义的属性“长度”