Ошибка SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 1 column 21 of the JSON data

JavaScript + JSON

let userPassObj = {
  "login" : document.getElementById('user-input').value, 
  "password" : document.getElementById('pass-input').value
}
let userPassParams = JSON.stringify(userPassObj)
xhr = new XMLHttpRequest() 
xhr.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        let wer = document.getElementById('wer') // Просто div на странице
        wer.innerHTML = JSON.parse(this.response)
    }
}
xhr.open("POST", "/myProjects/todolist/php/checkUser.php", true)
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.send("x=" + userPassParams); 

PHP

<?php 
// Подключаемся к базе данных 
require_once 'login.php';
header("Content-Type: application/json; charset=UTF-8");
$json = json_decode($_POST["x"], false);

if ($conn = mysqli_connect($hn, $un, $pw, $db)) {
    if ($result = mysqli_query($conn, 'SELECT `username` FROM users')) {
        while ($row = mysqli_fetch_assoc($result)) {
            echo json_encode($row);
        }
        mysqli_free_result($result);
    }       
    mysqli_close($conn);
}
else 
{
    echo 'Не удалось установить подключение к базе данных';
}
?>

Открываю инструмент разработчика в Mozilla Firefox, вкладку "Сеть", в ответе запроса получаю ошибку:

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 1 column 21 of the JSON data

На сайте JSONLint ссылается на пробел между объектами

Я понимаю, что ошибка заключена именно в пробеле между объектами. Интересует, как его исправить?


Ответы (1 шт):

Автор решения: Dmitry

Если правильно понял работу скрипта, то...

В цикле while Вы выводите две несвязных JSON-строки. Вместо этого, поместите их в массив и выведите их уже после цикла:

PHP:

<?php 
// Подключаемся к базе данных 
require_once 'login.php';
header("Content-Type: application/json; charset=UTF-8");
$json = json_decode($_POST["x"], false);

$output = array();

if ($conn = mysqli_connect($hn, $un, $pw, $db)) {
    if ($result = mysqli_query($conn, 'SELECT `username` FROM users')) {
        while ($row = mysqli_fetch_assoc($result)) {
            $output[] = $row; // собираем данные в массив
        }
        mysqli_free_result($result);
        echo json_encode($output); // выводим, закодировав в JSON-строку
    }       
    mysqli_close($conn);
}
else 
{
    echo 'Не удалось установить подключение к базе данных';
}
?>
→ Ссылка