Взаимодействие из 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 шт):
Когда вы отправляете 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']);
}