Взаимодействие из JS с функцией в PHP через JSON запрос

Задача. Нужно без обновления страницы вывести данные из базы данных в модальное окно, которое открывается при нажатии на кнопку. Для этого в JS я вызываю функцию PHP и передаю несколько параметров через JSON, затем также через JSON возвращаю массив с данными из таблицы базы данных.

let params = {
  userfunc: 'get_preview',
  modul: 'home',
  id: 1
};
let response = await fetch('./functions/functions.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  },
  body: JSON.stringify(params),
});
if (response.ok) {
  let result = await response.json();
  console.log(result);
};

в PHP пишу следующий код

function get_preview($module, $id) {
  global $db;
  $result = $db -> prepare("SELECT * FROM $module WHERE `status` != '0'");
  $result->execute(array($id));
  $result = $result->fetch(PDO::FETCH_LAZY);
  echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);
}
header('Content-Type: application/json');
$param = json_decode($_POST['params']);
$userfunc = $param['userfunc'];
$module = $param['modul'];
$id = $param['id'];
if ($userfunc == 'get_preview') {
 get_preview($module, $id);
}

Постоянно появляется ошибка JSON, помогите пожалуйста сделать код рабочим.


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

Автор решения: Alexey Ten

Когда вы отправляете JSON, на стороне PHP нужно совершить некоторые нетривиальные действия что бы достать из него данные.

И в 99% случаев нет никакого смысла этим заморачиваться и можно просто отправить данные в стандартном формате application/x-www-urlencoded который PHP сам распарсит в глобальный массив $_POST.

let params = {
  userfunc: 'get_preview',
  modul: 'home',
  id: 1
};
let response = await fetch('./functions/functions.php', {
  method: 'POST',
  body: new URLSearchParams(params),
});
if (response.ok) {
  let result = await response.json();
  console.log(result);
};
function get_preview($module, $id) {
  // получаем данные из БД
  echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);
}
header('Content-Type: application/json');
if ($_POST['userfunc'] == 'get_preview') {
 get_preview($_POST['modul'], $_POST['id']);
}
→ Ссылка