数据表抛出无效的 JSON 响应

Posted

技术标签:

【中文标题】数据表抛出无效的 JSON 响应【英文标题】:Datatables Throwing Invalid JSON Response 【发布时间】:2019-07-31 02:56:22 【问题描述】:

我在使用 SSP 获取数据时遇到了 Datatables 插件的问题。我使用了Custom SSP 库,但它返回了无效 JSON 响应的错误。这里有人实现了自定义 SSP 库吗?我将不得不使用JOINSWHEREGROUP BY 等。我也愿意接受有关如何使用 php 在表中实现实时过滤功能的建议,如示例表here 所示。因此,如果你们对如何在不使用 Datatables 的情况下实现这一点有任何想法,那也可以。

DataTables 警告:表 id=example - JSON 响应无效。有关此错误的更多信息,请参阅http://datatables.net/tn/1

初始化

< script >
  $(document).ready(function() 
    $('#example').DataTable(
      colReorder: true,
      "scrollX": true,
      "processing": true,
      "serverSide": true,
      "ajax": "rep_down_data.php"
    );
  ); <
/script>

带有 JOIN 查询的那个。此处使用了自定义 SSP 库。

<?php
$table = 't_user';
$primaryKey = 'id';
$columns = array(
    array( 'db' => 'is_phone_verified', 'dt' => 0 ),
    array( 'db' => 'email',  'dt' => 1 ),
    array( 'db' => 'mobile_number',   'dt' => 2 ),
    array( 'db' => 'first_name',     'dt' => 3 ),
	array( 'db' => 'last_name',     'dt' => 4 ),
    array( 'db' => 'rep_code',     'dt' => 5 ),
);
require('config.php');
$sql_details = array(
	'user' => $db_username,
	'pass' => $db_password,
	'db'   => $db_name,
	'host' => $db_host
);
require('ssp.customized.class.php' );
$joinQuery = "FROM `t_user` AS `u` JOIN `t_user_course` AS `ud` ON (`ud`.`user_id` = `u`.`id`)";
echo json_encode(
	SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns, $joinQuery )
);

运行良好,并且有 Datatables SSP 文件 (rep_down_data.php)

<?php
$table = 't_user';
$primaryKey = 'id';
$columns = array(
    array( 'db' => 'created_at', 'dt' => 0 ),
    array( 'db' => 'email',  'dt' => 1 ),
    array( 'db' => 'mobile_number',   'dt' => 2 ),
    array( 'db' => 'first_name',     'dt' => 3 ),
	array( 'db' => 'last_name',     'dt' => 4 ),
);
require('config.php');
$sql_details = array(
	'user' => $db_username,
	'pass' => $db_password,
	'db'   => $db_name,
	'host' => $db_host
);
require( 'ssp.class.php' );
echo json_encode(
    SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
);

表格的 HTML 代码

<section id="column-filtering">
  <div class="row">
    <div class="col-12">
      <div class="card">
        <div class="card-header">
          <h4 class="card-title">Rep Downloads</h4>
          <a class="heading-elements-toggle"><i class="la la-ellipsis-v font-medium-3"></i></a>
          <div class="heading-elements">
            <ul class="list-inline mb-0">
              <li><a data-action="collapse"><i class="ft-minus"></i></a></li>
              <li><a data-action="reload"><i class="ft-rotate-cw"></i></a></li>
              <li><a data-action="expand"><i class="ft-maximize"></i></a></li>
              <li><a data-action="close"><i class="ft-x"></i></a></li>
            </ul>
          </div>
        </div>
        <div class="card-content collapse show">
          <div class="card-body card-dashboard">
            <table id="example" class="display nowrap table table-striped table-bordered" style="width:100%;">
              <thead>
                <tr>
                  <th>Enr. Date</th>
                  <th>Email</th>
                  <th>Mobile Number</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                </tr>
              </thead>
              <tfoot>
                <tr>
                  <th>Enr. Date</th>
                  <th>Email</th>
                  <th>Mobile Number</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                </tr>
              </tfoot>
            </table>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>

【问题讨论】:

请发布您的实际代码,而不是屏幕截图 @Darren 我已经用截图编辑了帖子。如果还需要什么,请告诉我。 请用您的浏览器检查您的 php 脚本 ajax 响应并在此处发布(至少在结构上)。 【参考方案1】:

首先,您不需要在 html 中指定列标题。您可以使用带有title 属性的columns / columnDefs 选项设置那些。这样,在初始化 DataTable 之前,您将看不到具有默认样式的表。您的表格标记可能看起来像:&lt;table id="example" ...&gt;&lt;/table&gt;

但这当然不是问题的根本原因。

在我看来可疑的是您的 SQL。看起来您两次引用了 t_user 表:第一次,通过设置 $table 变量,第二次,使用 $joinQuery 的这一部分 - FROM t_user。因此,如果您有机会返回查询的输出,例如,在代码的适当位置使用var_dump(),或者使用echo 查询本身来检查其有效性,我猜,那会给出你给个提示。

您必须确定的另一件事是,您的 SQL 输出包含与您的行相对应的数组或对象数组,并且其中任何一个都包含在输出 JSON 的 data / aaData 中。否则,您可能需要在 ajax.dataSrc 选项中指定保存数组的 JSON 属性,或者如果您的 JSON 本身是数组,则将其设置为空字符串。

【讨论】:

以上是关于数据表抛出无效的 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

无效的 JSON 响应 Laravel 数据表

jquery数据表中的无效json响应

无效的 JSON 响应 Jquery 数据表

Laravel 数据表无效的 JSON 响应

无效的 JSON 响应:引导数据表

jquery Datatable 无效 JSON 响应 1 ,数据被检查为有效 json