为dataTable jquery插件获取数组时出现“非法字符串偏移”错误

Posted

技术标签:

【中文标题】为dataTable jquery插件获取数组时出现“非法字符串偏移”错误【英文标题】:"Illegal string offset" error when fetching array for dataTable jquery plugin 【发布时间】:2020-03-03 15:57:10 【问题描述】:

我创建了一个 ajax json 响应,其中将显示在我的 dataTable jquery 插件中。表的 id 是#dataTable。

这里是dataTable插件的代码:

$(document).ready(function() 
    var productTable = $("#dataTable").DataTable(
        "ajax": "../api/ajax/getProduct.php",
        "order": [[ 1, "desc" ]]
    );
);

这里是 getProduct.php

<?php
include_once('../../components/db.php');

$sqlb = "SELECT * FROM products WHERE status='active'";
$resultb = $conn->query($sqlb);
$data = $resultb->fetch_assoc();

$result = array();

foreach ($data as $key => $value) 
    $image = '<img   class="rounded-circle" src="../' . $value['image'] . '; ?>">';

    $buttons = '<a href="product-update.php' . $value["id"] . '" class="btn btn-info btn-sm"><i class="fa fa-edit" aria-hidden="true"></i></a><a onclick="removeProduct(' . $value["id"] . ')" class="btn btn-danger btn-sm"><i class="fa fa-trash" aria-hidden="true"></i></a>';

    $result[$key] = array(
        $value["description"],
        $value["price"],
        $image,
        $value["availability"],
        $buttons,
    );
// /foreach

echo json_encode($result);
?>

这是我在检查 XHR 时遇到的错误

Warning: Illegal string offset 'image' in C:\xampp\htdocs\copy\api\ajax\getProduct.php on line 11

Warning: Illegal string offset 'id' in C:\xampp\htdocs\copy\api\ajax\getProduct.php on line 13

Warning: Illegal string offset 'id' in C:\xampp\htdocs\copy\api\ajax\getProduct.php on line 13

Warning: Illegal string offset 'description' in C:\xampp\htdocs\copy\api\ajax\getProduct.php on line 16

Warning: Illegal string offset 'price' in C:\xampp\htdocs\copy\api\ajax\getProduct.php on line 17

Warning: Illegal string offset 'availability' in C:\xampp\htdocs\copy\api\ajax\getProduct.php on line 19

这是我在页面加载时从 dataTable 本身得到的弹出错误。

DataTables warning: table id=dataTable - Invalid JSON response. For more information about this error, please see http://datatables.net/tn/1

这里真正的问题似乎是编码数据本身是错误的。出现此错误,我无法将数据显示到 dataTable 本身中。

【问题讨论】:

删除 $buttons 之后 $result 数组中的最后一个逗号,然后如果这不能修复它而不是回显 $result 尝试回显测试字符串并看看你得到了什么。回声 json_encode("测试");此外,在 getProduct.php 页面的顶部添加 header("Content-type: application/json; charset=utf-8");就在您的 $include_once(".... 之前和之后 foreach 之前尝试var_dump($data); die(); 并在此处发布结果。 @Icewine 我已经尝试过你的方法。我已经添加了标头并添加了 json_encode("test")。我已经使用 ajax 响应测试了它的输出,它没有在控制台上输出“测试” @Bluetree jsfiddle.net/bzhur8tn 删除 json_encode("test") 并将 $result 放回那里,但保留之前的标题。然后在 $(document).ready(function() 之后和 var productTable.... 之前的代码中添加一个新的 ajax 请求来测试你得到的响应。试试这个: $.ajax(type: "post ", url: "../api/ajax/getProduct.php", 成功: function(data) console.log("success"); console.log(data); , error: function(e)console .log("error"); console.log(e);); 【参考方案1】:

基于var_dump($data); 结果:

 array(9) 
  ["id"]=>
  string(1) "2"
  ["names"]=>
  string(12) "Fruity Split"
  ["price"]=>
  string(5) "50.00"
  ["qty"]=>
  string(1) "1"
  ["image"]=>
  string(26) "images/products/menu-2.jpg"
  ["description"]=>
  string(90) "Dessert made with a split banana, ice cream, sauce, whipped cream, nuts, and a strawberry."
  ["category"]=>
  string(7) "dessert"
  ["availability"]=>
  string(9) "Available"
  ["status"]=>
  string(6) "active"

它给你这个错误的原因:

警告:非法字符串偏移

这是因为你只是在循环 1 行

改为将您的代码更改为:

<?php
include_once('../../components/db.php');

$sqlb = "SELECT * FROM products WHERE status='active'";
$resultb = $conn->query($sqlb);

// This just return single row
// $data = $resultb->fetch_assoc();

$result = array();

//Use while instead of foreach
while ($value =  $resultb->fetch_assoc()) 
    $image = '<img   class="rounded-circle" src="../' . $value['image'] . '; ?>">';

    $buttons = '<a href="product-update.php' . $value["id"] . '" class="btn btn-info btn-sm"><i class="fa fa-edit" aria-hidden="true"></i></a><a onclick="removeProduct(' . $value["id"] . ')" class="btn btn-danger btn-sm"><i class="fa fa-trash" aria-hidden="true"></i></a>';

    // Add Keys For DataTable column
    $result[] = array(
        'description' => $value["description"],
        'price' => $value["price"],
        'image' => $image,
        'availability' => $value["availability"],
        'buttons' => $buttons,
    );


echo json_encode($result);
?>

【讨论】:

第 18 行出错 $key is undefined。去掉$key后,输出只有1行,数据库输出的最后一行数据应该是数据库内的所有数据 @LexCabrera 我删除了$key。再试一次。 @LexCabrera 这应该会显示您产品中的所有活动状态。如果您只有 1 个 active 行,请检查您的产品表。 这里有超过 1 个“活动”行 你能在while 循环之后var_dump($result);die();。将其放在while 循环之外。【参考方案2】:

根据@Bluetree 的回答,为 dataTable 添加键是不必要的。

正确的做法是,数据的编码数组应该首先在数组内部输入一个数据字符串“data”,因为我们只需要遵循dataTable所需的格式。

<?php
include_once('../../components/db.php');

$sql = "SELECT * FROM products WHERE status='active'";
$query = $conn->query($sql);

while($data=$query->fetch_assoc())
    $image = '<img   class="rounded-circle" src="../' . $data['image'] . '">';

    $buttons = '<a href="product-update.php' . $data['id'] . '" class="btn btn-info btn-sm"><i class="fa fa-edit" aria-hidden="true"></i></a><a onclick="removeProduct(' . $data['id'] . ')" class="btn btn-danger btn-sm"><i class="fa fa-trash" aria-hidden="true"></i></a>';

    // instead of just $result[], we need to use $result[data][] in order to use it for dataTable
    $result["data"][] = array(
        $data['names'],
        $data['description'],
        $data['price'],
        $image,
        $data['availability'],
        $buttons,
    );


echo json_encode($result);

// console.log output would be "data":[["Blueberry Cheesecake"," This blueberry cheesecake starts with a buttery graham cracker crust, a creamy cheesecake center, and a tangy blueberry swirl.","80.00","","Available","<\/i><\/a><\/i><\/a>"],["Fruity Split","Dessert made with a split banana, ice cream, sauce, whipped cream, nuts, and a strawberry.","50.00","","Available","<\/i><\/a><\/i><\/a>"],["Pancake","Pancake topped with blueberry and strawberry.","80.00","","Available","<\/i><\/a><\/i><\/a>"],["Steak","Steak. . . . . in which I need to output
?>

dataTable 中的 AJAX 需要有一个 URL 和数据本身。 只提供:

$('#example').dataTable( 
  "ajax": "data.json",
  
 );

将是这样编码的简写方式:

$('#example').dataTable( 
  "ajax": 
    "url": "data.json",
    "data": 
        "user_id": 451
    
  
 );

因为 ajax 的第一个示例格式本身已经有一个 url 和数据。 url 中的返回值是数据本身,而 ajax 的 url 是 url 本身。因此,我们需要在数组的编码结果中的返回值内有一个“数据”。

【讨论】:

以上是关于为dataTable jquery插件获取数组时出现“非法字符串偏移”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用jQuery开发datatable分页表格插件

Jquery DataTables 插件 - sAjaxSource

jquery datatable插件aadata格式不显示表格

jquery.datatable插件如何不自动加载数据?

001_ jQuery的表格插件dataTable详解

jquery插件datatable为何不显示数据?