PHP возвращает POST запросу сдвоенный массив, вместо одного

Делаю через XMLHttpRequest POST запрос к PHP файлу. Файл в свою очередь возвращает после выполнения массив, который показывает, все ли в порядке:

$response = [
    'message' => 'Something goes wrong.',
    'success' => false,
];

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    $response['message'] = "POST request was not detected.";
    echo json_encode($response);
}

if (!( isset($_POST['app-email']) && isset($_POST['app']) )) {
    $response['message'] = "Some POST variables were not detected.";
    echo json_encode($response);
}

//Некоторые действия с данными

if($success){ // $success - результат успешности операций с данными
    $request['message'] = "Successfully delivered."; //45 строка
    $request['success'] = true; //46 строка
    echo json_encode($request);
} else {
    $response['message'] = "Can't be delivered.";
}

echo json_encode($response);

PHP, как видно из кода, должен возвращать массив в формате JSON. И он возвращает, но почему-то сразу два, причем склеенные друг с другом:

{message:"Successfully delivered", success: true}{message:"Something goes wrong", success: false}

Из-за того, что они просто "склеены" в строке, JS при попытке распарсить эту строку выдает ошибку синтаксиса в месте стыка "}{".

Скорее всего это из-за echo, ведь оно не прерывает выполнение PHP. Отсюда два вопроса:

  1. Почему возвращается два разных массива, ведь в 45 строке (указал) мы меняем содержимое массива. А возвращается измененный и массив с данными "по умолчанию".
  2. Как грамотно сделать подобную логику? Чтобы в разных ситуациях возвращал массив с состоянием выполнения, но только один раз. (Когда использую exit вместо Echo, то возникает 500 ошибка сервера)

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

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

Ну все верно, вам нужно останавливать программу если распечатан готовый респонс, то-есть на каждом этапе echo json_encode($request); нужно делать die; для возвращения респонса джейсоном, или оформить как-то так, для избежания дублирования кода и операций:


try {
    if ($_SERVER['REQUEST_METHOD'] != 'POST') {
        throw new \DomainException("POST request was not detected.");
    }

    if (!( isset($_POST['app-email']) && isset($_POST['app']) )) {
        throw new \DomainException('Some POST variables were not detected.');
    }

    //Некоторые действия с данными

    if ($success) { // $success - результат успешности операций с данными
        echo json_encode(['success' => true, 'message' => 'Successfully delivered.']);
        die;
    }

    throw new \DomainException('Can\'t be delivered.');
} catch (\DomainException $exception) {
    echo json_encode(['success' => false, 'message' => $exception->getMessage()]);
    die;
}
→ Ссылка