Ошибка «Недопустимое смещение строки» при получении массива для плагина jquery dataTable - PullRequest
1 голос
/ 07 ноября 2019

Я создал ответ ajax json, в котором он будет отображаться в моем плагине dataTable jquery. Идентификатор таблицы # 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 width="50" height="40" 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

похоже, что настоящая проблема здесь в том, что сами закодированные данные неверны. с этой ошибкой я не могу отобразить данные в самой таблице данных.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Основываясь на ответе @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 width="50" height="40" 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
?>

AJAX в dataTable должен иметь URL-адрес и сами данные. предоставляя его просто:

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

было бы кратким способом его кодирования следующим образом:

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

, потому что в первом примере формата ajax уже есть URL-адрес и сами данные. возвращаемое значение в url - это сами данные, а url для ajax - это сам url. таким образом, нам нужно иметь «данные» внутри возвращаемого значения в закодированном результате массива.

0 голосов
/ 07 ноября 2019

Основывается на 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 width="50" height="40" 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);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...