У меня есть следующий код, который будет печатать 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 недействителен.
Может ли кто-нибудь дать совет по этому вопросу?
@RedBottle извиняется, я не знаю, что не так с сайтом stackoverflow, но иногда он пропускает добавление кодов. Я добавил свой код сейчас.
echoпослеwhile.
@u_mulder, это напечатает только 1 запись из базы данных mysql.
extract не очень хорошая идея, это может повредить другие переменные
Почему вы открыли второй прицел в то время как? while () { {} } ?
ваше слияние сделано неправильно. Сначала заполните массив и закодируйте его в json, а не наоборот






Вот как должно быть:
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()...)
@ Сид, без extract() я не могу создать многомерный массив. взгляните на $channel = array(....
@JamesJuanjie 'id' => $row['id'] и так далее?
вы забыли добавить свои коды