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. Отсюда два вопроса:
- Почему возвращается два разных массива, ведь в 45 строке (указал) мы меняем содержимое массива. А возвращается измененный и массив с данными "по умолчанию".
- Как грамотно сделать подобную логику? Чтобы в разных ситуациях возвращал массив с состоянием выполнения, но только один раз. (Когда использую exit вместо Echo, то возникает 500 ошибка сервера)
Ответы (1 шт):
Ну все верно, вам нужно останавливать программу если распечатан готовый респонс, то-есть на каждом этапе 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;
}