数据表抛出无效的JSON响应

时间:2019-03-09 04:30:34

标签: javascript php jquery mysql datatables

在使用SSP提取数据时,Datatables插件遇到问题。我使用过Custom SSP库,但是返回的错误是JSON响应无效。这里有人实现了自定义SSP库吗?我将不得不使用JOINSWHEREGROUP BY等。对于示例如何使用PHP在表中实现实时过滤功能,我也持开放态度,例如示例表{ {3}}。因此,如果您对如何在不使用数据表的情况下实现这一点有任何想法,那也可以正常工作。

  

DataTables警告:表格ID =示例-无效的JSON响应。有关此错误的更多信息,请参见here

初始化

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

1 个答案:

答案 0 :(得分:1)

首先,您无需在HTML中指定列标题。您可以使用具有columns属性的columnDefs / title选项来设置。这样,在初始化DataTable之前,您将不会看到具有默认样式的表。您的表格标记可能看起来像是:<table id="example" ...></table>

但是,那当然不是您问题的根本原因。

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

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