Как предотвратить добавление данных в локальную базу данных после обновления?

Вопрос или проблема

-3

В настоящее время я пытаюсь загрузить данные в базу данных, что мне удалось сделать успешно. Затем я отображаю их на editPage.php и у меня есть возможность удалить любые данные, которые были введены в базу данных. Проблема в том, что каждый раз, когда я удаляю строку данных из базы данных, моя страница обновляется, и те же данные снова вводятся в базу данных. Как я могу этого избежать?

Вот мой editPage.php, который позволяет вставлять, просматривать и удалять данные.

<?php
session_start();

$connect = mysqli_connect("localhost", "root", "", "skilltask2");

if ($_SESSION["loggedin"] == false) {
    header('Location: skillsTask2.php');
}
if(isset($_POST['content']) || isset($_POST['header']) || isset($_POST['image'])){
    $displayText = $_POST['content'];
    $displayHeader = $_POST['header'];
    $dir="images/";
    $file=$dir.basename($_FILES["image"]["name"]);
    $query = "INSERT INTO `content` (`image`) VALUES ('$file')";
    if(strlen($displayText)>0){
        $query = "INSERT INTO `content` (`text`, `header`, `image`) VALUES ('$displayText', '$displayHeader', '$file')";
    }

    if (mysqli_query($connect, $query)) {
        echo '<script>alert("Название, текст и изображение были загружены в базу данных")</script>';
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Редактировать страницу</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <link rel="stylesheet" href="editPage.css">
    <script>
        function deleteContent(id,header) {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", "processDelete.php?id="+id, true);
            xhr.send();
            alert("Вы удалили "+header);
            location.reload();
        }
    </script>
</head>
<body>
    <br>
    <br>
    <div class="container" style="width:25vw;">
        <h3 align="center">Обновите и вставьте заголовки, текст и изображения</h3>
        <br>
        <form method="post" enctype="multipart/form-data">
            <h3>Название</h3>
            <input type="text" name="header" required />
            <br>
            <br>
            <h3>Текст</h3>
            <input type="text" name="content" required />
            <br>
            <br>
            <h3>Изображение</h3>
            <input type="file" name="image" required />
            <br>
            <br>
            <br>
            <input type="submit" name="all" value="Загрузить все" />
        </form>
        <br>
        <br>
        <?php
            echo "<a href=\"skillsTask2.php\">Выйти</a>";
        ?>
    </div>
    <div id="rightSide">
        <?php
                    $conn = mysqli_connect("localhost", "root", "", "skilltask2");
                    $query = "SELECT * FROM content ORDER BY `id` DESC";  
                    $result = mysqli_query($connect, $query); 
                        while($row = mysqli_fetch_array($result))   {  
                        $theimage = $row['image'];
                        $theheader = $row['header'];
                        $thetext = $row['text'];
                        $id = $row['id'];
                         echo "<div id='card'>
                                <img src=\"".$theimage."\" >
                                <div id='cardHeader'>
                                    <b>$theheader</b><br>$thetext
                                </div>
                                <button onclick=deleteContent($id,'$theheader')>Удалить</button>
                        </div>
                        ";
                        }
        ?>
    </div>
</body>
</html>

А вот и моя страница processDelete.php, которая удаляет строки из базы данных.

<?php
    session_start();
    $connect = mysqli_connect("localhost", "root", "", "skilltask2");
    $id=$_GET['id'];
    $query = "DELETE FROM content WHERE id=$id"; 
    $result = mysqli_query($connect,$query) or die ( mysqli_error());
?>

Надеюсь, вы сможете помочь. Спасибо еще раз.

Я исправил это, используя header("Refresh:0");

Это позволяет странице обновляться сразу после обработки if утверждения, позволяя странице не повторно отправлять данные, которые были ранее вставлены.

Ответ или решение

Для решения проблемы с повторным добавлением данных в локальную базу данных после обновления страницы, важно понимать, как работает HTTP-протокол и механизмы, используемые для обработки запросов. Давайте рассмотрим несколько методов, которые помогут избежать этой ситуации и улучшить функционирование вашего приложение.

1. Использование метода POST-Redirect-GET (PRG)

Наиболее эффективным и распространенным способом предотвращения повторного добавления данных после обновления страницы является использование шаблона PRG. Этот подход включает в себя три шага:

  1. Поступление данных: Когда форма отправляется через метод POST, данные обрабатываются на сервере.
  2. Перенаправление: После успешной обработки данных, вы перенаправляете пользователя на другую страницу (или ту же страницу) с помощью заголовка Location. Это может быть сделано с помощью функции header() в PHP.
  3. Отображение данных: На целевой странице данные могут быть отображены без угрозы повторного добавления, поскольку на этом этапе выполнен лишь запрос GET.

Вот как это может выглядеть в вашем коде:

if (mysqli_query($connect, $query)) {
    header('Location: editPage.php'); // Перенаправляем на ту же страницу после успешного добавления
    exit(); // Обязательно вызываем exit после header
}

Эта простая модификация предотвратит повторную отправку данных при обновлении страницы.

2. Проверка на наличие данных перед добавлением

Убедитесь, что вы не добавляете дублирующиеся записи в базу данных. Это можно реализовать с помощью предварительной проверки:

$queryCheck = "SELECT * FROM content WHERE header='$displayHeader' AND text='$displayText'";
$resultCheck = mysqli_query($connect, $queryCheck);

if (mysqli_num_rows($resultCheck) == 0) {
    // Вставка, если записи нет
    if (mysqli_query($connect, $query)) {
        header('Location: editPage.php');
        exit();
    }
} else {
    echo '<script>alert("Данные уже существуют в базе данных.");</script>';
}

3. Использование сессий для хранения состояния

Вы также можете использовать сессии для контроля процесса добавления данных. После успешного добавления данных можно установить флаг в сессии:

if (mysqli_query($connect, $query)) {
    $_SESSION['data_added'] = true; // Устанавливаем флаг в сессии
    header('Location: editPage.php');
    exit();
}

Затем в телах страниц вы можете проверять этот флаг для отображения уведомлений или сброса состояния.

4. AJAX запрос для удаления без перезагрузки страницы

Вы правильно используете AJAX для удаления записей. Убедитесь, что после успешного удаления вы очищаете кэш или перезагружаете данные, чтобы увидеть актуальное состояние:

function deleteContent(id, header) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "processDelete.php?id=" + id, true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            alert("Данные удалены: " + header);
            location.reload(); // Обновляем страницу для получения актуальных данных
        }
    }
    xhr.send();
}

Заключение

Применение шаблона PRG, проверка существующих данных, управление состоянием сессии и использование AJAX — это ключевые шаги для избегания проблем с дублированием записей в базе данных. Эти подходы не только сделают ваше приложение более надежным, но и улучшат общий пользовательский опыт.

Оцените материал
Добавить комментарий

Капча загружается...