Есть ли способ предотвратить возврат echo json_encode() ответа JSON со всей страницей при отправке формы в тот же PHP-скрипт?

У меня есть единственный файл index.php в проекте. Я знаю, что мне следует отделить логику от представления, использовать разные файлы для PHP, JS и HTML. Это всего лишь тест:

<?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {        
        if (isset($_POST["item"]) && $_POST["item"] == "new") {
            $description = filter_input(INPUT_POST, trim("description"));
            echo json_encode($description);
        }        
    }
?>

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Itens</title>
</head>
<body>
    <form method = "post">
        <input type = "text" name = "description" placeholder = "Description">
        <button type = "submit">Add Item</button>
    </form>

    <script>
        const form = document.querySelector("form")
        form.addEventListener('submit', async (e) => {
            e.preventDefault()
            const item = "new"
            const description = form.description.value            
            const formData = new FormData()
            formData.append("item", item)
            formData.append("description", description)            
            try {
                await fetch('./index.php', {
                    method: 'POST',
                    body: formData,
                    headers: {
                        'Accept': 'application/json, text/plain, */*'                
                    }
                })
                .then((res) => res.json())
                .then((data) => {                    
                    alert(data)                    
                })
            } 
            catch(error) {}
        })
    </script>
    
</body>
</html>

Функция echo json_encode() работает и отправляет ответ, но также отправляет всю страницу, перезагружая index.php, что делает невозможной работу со значением ответа в коде выборки JavaScript. При работе с echo json_encode() в сценарии, отличном от кода, который его вызвал, этого, конечно, не происходит. Можно ли это исправить, сохранив одну файловую структуру?

попробовал exit() после эха?

Arun A S 20.06.2024 06:59

Вместо echo json_encode($description); просто сделайте exit( json_encode($description) );

Professor Abronsius 20.06.2024 07:39
trim("description") не имеет абсолютно никакого смысла
Phil 20.06.2024 08:01

Вам также следует использовать оператор return после echo json_encode(), но его использование с оператором существования выглядит многообещающе.

Dhruv Pandya 20.06.2024 08:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

да, помести это в HTML

<?php
    $jsonData = {};

    if ($_SERVER["REQUEST_METHOD"] == "POST") {        
        if (isset($_POST["item"]) && $_POST["item"] == "new") {
            $description = filter_input(INPUT_POST, trim("description"));
            $jsonData = json_encode($description);
        }        
    }
?>

<script>
  const json = <?php echo $jsonData; ?>
</script>
<pre><?php echo $jsonData; ?></pre>

Более чистый способ, как вы упомянули (REST API), — это поместить вывод json в отдельный скрипт php и использовать javascript для запроса json.

Мне нужно найти способ использовать ответ при выборке JavaScript, чтобы я мог динамически изменять DOM с данными из ответа, но я не знаю, возможно ли это, потому что страница перезагружается вместе с ответом.

Developer 20.06.2024 06:37

да, это обычный способ сделать что-то: используйте выборку, чтобы запросить php-файл, содержащий json, затем вы можете снова использовать javascript, чтобы записать эти значения в документ. У вас есть POST, поэтому предположим, что вам нужно использовать js для отмены отправки формы, отправить данные формы с помощью выборки и получить ответ, чтобы затем распечатать документ. замена функциональности HTML по умолчанию на javascript — единственный способ предотвратить перезагрузку страницы. Возможно, потратите некоторое время на учебник по REST.

danielRICADO 20.06.2024 23:21
Ответ принят как подходящий

Все, что тебе нужно:

  1. добавьте квадратную скобку (чтобы массив использовался для функции json_encode)

    echo json_encode([$description]);

  2. добавить выход(); как написал Арун А.С.

и, наконец, верхняя часть будет:

if ($_SERVER["REQUEST_METHOD"] == "POST") {        
    if (isset($_POST["item"]) && $_POST["item"] == "new") {
        $description = filter_input(INPUT_POST, trim("description"));
        echo json_encode([$description]);
        exit();
    }        
}

В идеале вы также должны добавить header('Content-type: application/json') перед echo.

Phil 20.06.2024 07:50

согласен, очень хорошая идея

Andrey Ivanov 20.06.2024 07:54

Подождите, а почему ОП должен добавлять квадратные скобки вокруг $description? Это не имеет никакого смысла

Phil 20.06.2024 08:01

Существует только практика использования массива типов для функции json_encode(), но, как видно, json_encode() допускает смешанный тип, поэтому действительно возможно вообще не использовать скобки.

Andrey Ivanov 20.06.2024 08:10

Это решило проблему, спасибо всем за помощь!

Developer 20.06.2024 16:22

Другие вопросы по теме