Как создать многомерный массив JSON из базы данных MYSQL?

У меня есть следующий код, который будет печатать JSON из базы данных mysql.

Однако, когда я проверяю вывод JSON, JSON недействителен.

Это вывод JSON на моей странице PHP:

[{
    "id": "1",
    "title": "test title",
    "about": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
    "address": "some address goes here",
    "lat": "51",
    "lon": "0.888",
    "distance": {
        "miles": 3.973345345,
        "kilometers": 6.39345348
    }
}][{
    "id": "3",
    "title": "test title 5",
    "about": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
    "address": "some address goes here",
    "lat": "51",
    "lon": "0.256",
    "distance": {
        "miles": 3.9735000071413,
        "kilometers": 6.3947283954928
    }
}]

Это мой PHP-код:

header('Content-type: application/json');

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2) {    
$theta = $longitude1 - $longitude2;
$miles = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos (deg2rad($latitude2)) * cos(deg2rad($theta)));
$miles = acos($miles);
$miles = rad2deg($miles);
$miles = $miles * 60 * 1.1515;
$kilometers = $miles * 1.609344;
return compact('miles','kilometers'); 
}

$records = array();


/* soak in the passed variable or set our own */
$latitude2 = floatval($_GET['latitude']); //no default
$longitude2 = floatval($_GET['longitude']); //no default


/* grab the posts from the db */
   $sql = "SELECT * FROM businesses ORDER BY id";
   $query = mysqli_query($db_conx, $sql);
   $productCount = mysqli_num_rows($query);
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){
{

extract($row);


$latitude = $row['lat'];    
$longitude = $row['lon'];


$point1 = array('lat' => number_format ($latitude,4,'.',''), 'long' => number_format ($longitude,4,'.',''));
$point2 = array('lat' => number_format ($latitude2,4,'.',''), 'long' => number_format ($longitude2,4,'.',''));
$distance = getDistanceBetweenPointsNew($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);


$channel = array(
'id' => $id,
'title' => $title,
'about' => $about,
'address' => $address,
'lat' => $latitude,
'lon' => $longitude,
'distance' => $distance,
);
}   
$channels = array($channel);
$records[] = $channel;
//$json = json_encode($channel);
//echo $json;

echo '' . json_encode($records, JSON_UNESCAPED_SLASHES) . '';
}      

Если у меня есть только одна запись в базе данных, она работает нормально, но когда ее более 1 записи, вывод JSON недействителен.

Может ли кто-нибудь дать совет по этому вопросу?

вы забыли добавить свои коды

Red Bottle 14.06.2019 13:58

@RedBottle извиняется, я не знаю, что не так с сайтом stackoverflow, но иногда он пропускает добавление кодов. Я добавил свой код сейчас.

James Juanjie 14.06.2019 14:00
echoпослеwhile.
u_mulder 14.06.2019 14:02

@u_mulder, это напечатает только 1 запись из базы данных mysql.

James Juanjie 14.06.2019 14:03
extract не очень хорошая идея, это может повредить другие переменные
Cid 14.06.2019 14:04

Почему вы открыли второй прицел в то время как? while () { {} } ?

Cid 14.06.2019 14:05

ваше слияние сделано неправильно. Сначала заполните массив и закодируйте его в json, а не наоборот

Red Bottle 14.06.2019 14:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как должно быть:

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
    // code without `extract`:

    $latitude = $row['lat'];    
    $longitude = $row['lon'];

    $point1 = array('lat' => number_format ($latitude,4,'.',''), 'long' => number_format ($longitude,4,'.',''));
    $point2 = array('lat' => number_format ($latitude2,4,'.',''), 'long' => number_format ($longitude2,4,'.',''));
    $distance = getDistanceBetweenPointsNew($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);

    $channel = array(
        'id' => $row['id'],
        'title' => $row['title'],
        'about' => $row['about'],
        'address' => $row['address'],
        'lat' => $latitude,
        'lon' => $longitude,
        'distance' => $distance,
    );

    $records[] = $channel;
}
// echo ONCE
// and as `json_encode` returns a string - using '' is USELESS
echo json_encode($records, JSON_UNESCAPED_SLASHES);

Так же в качестве $point2никогда не меняется лучше ставить

$point2 = array('lat' => number_format ($latitude2,4,'.',''), 'long' => number_format ($longitude2,4,'.',''));

за пределамиwhile петля.

Я бы добавил все содержимое цикла, там есть странности (вторая область действия, использование extract()...)

Cid 14.06.2019 14:07

@ Сид, без extract() я не могу создать многомерный массив. взгляните на $channel = array(....

James Juanjie 14.06.2019 14:08

@JamesJuanjie 'id' => $row['id'] и так далее?

Cid 14.06.2019 14:10

Другие вопросы по теме