为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 DataTables 插件 - sAjaxSource