Я создал базу данных mySQL с помощью phpMyAdmin на моем локальном сервере. В этой базе данных я сохранил имена и местоположение моих друзей (вместе с идентификатором в качестве первичного ключа для базы данных). Я написал и запустил следующий php-скрипт, чтобы получить эти данные из базы данных и спроецировать их на свой локальный веб-сервер (XAMPP):
<?php
$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
header('Content-Type: application/json');
$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo json_encode($row, JSON_PRETTY_PRINT);
}
}
Однако таким образом я беру такой вывод:
{
"id": "1",
"name": "David Belton",
"location": "New Haven"
}{
"id": "2",
"name": "Alex Danson",
"location": "New York"
}
что в целом не является допустимым выходом json. Я хотел бы получить следующий результат:
[{
"id": "1",
"name": "David Belton",
"location": "New Haven"
}, {
"id": "2",
"name": "Alex Danson",
"location": "New York"
}]
(который также является допустимым выходом json)
Как я могу это сделать?






Это происходит потому, что вы выводите каждый объект изолированно от других внутри своего цикла.
while ($row = mysqli_fetch_assoc($result))
echo json_encode($row, JSON_PRETTY_PRINT); //<-- echo out an isolated JSON object
Вместо этого просто храните все в массиве, пока не закончите, а затем выводите JSON один раз, а не итеративно.
$arr = [];
while ($row = mysqli_fetch_assoc($result)) $arr[] = $row;
json_encode($arr, JSON_PRETTY_PRINT);
Дело в том, чтобы сохранить извлеченные ассоциативные массивы во внешнем массиве, а затем JSON закодировать этот внешний массив. Это дает результат, который хочет OP.
Благодарю за ваш ответ. Возможно, мне бы хотелось, чтобы он был менее плотным, но он правильный, так что все в порядке.
Создайте массив и вставьте эти записи в цикл while. В конце echo json_encode();, чтобы вывод был в правильном формате JSON
$records = array();
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$records[] = $row;
}
}
echo json_encode($records, JSON_PRETTY_PRINT);
Сохраните результат в массиве, затем повторите закодированный / отформатированный массив:
<?php
$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
header('Content-Type: application/json');
$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
$arr = array();
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
array_push($arr, $row);
}
}
echo json_encode($arr, JSON_PRETTY_PRINT);
Или, вместо получения результатов по одному, просто используйте mysqli_fetch_all
if ($resultCheck > 0)
{
$row = mysqli_fetch_all($result);
echo json_encode($row, JSON_PRETTY_PRINT);
}
что на самом деле быстрее и использует меньше памяти: http://php.net/manual/en/mysqli-result.fetch-all.php
Это довольно круто (проголосовать за). Однако имейте в виду, что это возвращает массив массивов, а не простой массив.
Спасибо! Вы правы, это массив массивов, но в вашем принятом ответе $arr также является массивом массивов
Ха-ха, я не понял этого, даже если протестировал ... также я, наконец, использовал второй ответ ...
Конечно, результат
mysqli_fetch_assoc($result)будет таким же, как и$arr, поэтому, возможно, более простым решением будет простоjson_encode(mysqli_fetch_assoc($result), JSON_PRETTY_PRINT);? Но +1 за объяснение.